zoukankan      html  css  js  c++  java
  • Array和ArrayList的区别与联系

      博主今天去了一个java的实习面试,发现有好多java最基础的数据结构对于博主来说反而感到陌生,在面试官问一些常见的例如HashMap这样的数据结构,博主能回答的头头是道,但是在问到Array和ArrayList的区别和联系之后,却让博主一脸懵。好吧,不多说,现在特此整理。

      首先, Array是java中的数组,我们声明java的数组有三种方式:

    1 int[] a = new int[10]; 
    2 int a[] = new int[10]; //这种方式同c语言一样
    3 int a[] = {1,2,3,4}; 

    从上面的声明中可以看出来,我们在定义了一个数组的时候,必须指定这个数组的数据类型,也就是说,数组是相同数据类型的集合。另外,在数组声明的时候,我们也声明了数组的大小,数组的元素个数是固定的。

    下面,我们看看数组的应用:

     1 import java.util.Arrays;
     2 
     3 /**
     4  * @author jy
     5  * @time 下午7:59:26
     6  */
     7 public class ArrayAndArrayList {
     8     public static void main(String[] args) {
     9         
    10      int a[] = new int[4];
    11      System.out.println(a.length);  //数组的长度属性
    12      
    13      int b[] = {1,2};
    14      int c[] = {1,2};
    15      System.out.println(b.equals(c));  //输出为false,可见数组并没有重写hashcode()和equals()方法
    16      System.out.println(Arrays.equals(b, c));  //利用java.util.Array的equals()来判断数组是否相等,这里输出true
    17      System.out.println(isEquals(b,c));
    18      
    19     }
    20 
    21     /**
    22      * 重写方法来手动实现数组之间的比较方法
    23      */
    24     public static boolean isEquals(int[] b, int[] c) {
    25         
    26         if(b == null || c == null){
    27             return false;
    28         }
    29         if(b.length != c.length){
    30             return false;
    31         }
    32         for (int i = 0; i < c.length; i ++) {
    33             if(b[i] != c[i]){
    34                 return false;
    35             }
    36         }
    37         return true;
    38     }
    39     
    40 }

    可见,数组的长度是固定的,不可变的。数组并未重写object的hashcCode()和equals()方法。

      我们都知道,数组还可以是二维的,下面我们看看二维数组是如何声明的:

    1 int[][] da = new int[2][3];  //推荐用这种声明方式,更能表明数组的类型
    2 int db[][] = new int[4][3];

    但是,有一种变长的二维数组:

    1 int[][] dc = new int[2][];  //第一维的大小不能空缺,第二维的大小可以是不一样的。
    2 dc[0] = new int[2];
    3 dc[1] = new int[3];

    好了,数组这个基本的数据结构的应用我们就说到这里,为了突出主题,其余的一些不相干的应用我们就不扯了。

      下面,我们再来看看ArrayList这个集合:

    ArrayList是动态数组,也就是数组的复杂版本,它可以动态的添加和删除元素,ArrayList实现了java.util.Collections.Collection.List接口。下面我们来看一下最基本的声明:

    ArrayList list = new ArrayList(10);  
    ArrayList<Integer> list1 = new ArrayList<Integer>();

    第一种声明中,在不使用泛型的情况下,这个list是可以添加进不同类型的元素的,而且arraylist是可以不用指定长度的。在使用泛型时,我们就只能添加一种类型的数据了。

    ArrayList的重要方法和属性如下代码所示:

     1 ArrayList<Integer> list = new ArrayList<Integer>();
     2         list.add(1);
     3         list.add(2);
     4         list.add(3);
     5         list.remove(1);
     6         Object[] p = list.toArray();  //转化成数组
     7         System.out.println(p[0]);
     8         System.out.println(list.contains(4));  //是否包含某个元素
     9         System.out.println(list.size());  //list的长度
    10         System.out.println(list.get(0));  //按位获取list中的元素
    11 list.trimToSize();  //这个方法用于将ArrayList固定到实际元素的大小,当动态数组元素确定不在添加的时候,可以调用这个方法来释放空余的内存

     上面显示了ArrayList的一些重要的方法。下面我们就这两个集合类进行对比:

      (1)ArrayList是Array的复杂版本
              ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。

      (2)存储的数据类型

              ArrayList可以存储异构对象,而Array只能存储相同数据类型的数据。

      (3)长度的可变

               Array的长度实际上是不可变的,二维变长数组实际上的长度也是固定的,可变的只是其中元素的长度。而ArrayList的长度既可以指定(即使指定了长度,也会自动2倍扩容)也可以不指定,是变长的。

       (4)存取和增删元素

               对于一般的引用类型来说,这部分的影响不是很大,但是对于值类型来说,往ArrayList里面添加和修改元素,都会引起装箱和拆箱的操作,频繁的操作可能会影响一部分效率。另外,ArrayList是动态数组,它不包括通过Key或者Value快速访问的算法,所以实际上调用IndexOf、Contains等方法是执行的简单的循环来查找元素,所以频繁的调用此类方法并不比你自己写循环并且稍作优化来的快,如果有这方面的要求,建议使用Hashtable或SortedList等键值对的集合。

      好了,关于这两个数据结构的对比我们就到这里,如果有觉得不妥的地方,欢迎大家指正。

      另外,这是我第一次写博客,求轻喷。

  • 相关阅读:
    API之绘图(转)
    API之子窗口创建 (转)
    函数调用规范__cdecl和__stdcall的区别一目了然(表格形式)(二)
    _cdecl 和_stdcall及其他调用方式 (一)
    sizeof的深入理解
    VC++中2进制,10进制,16进制相互转换
    传说中的数据结构
    字符串扩展
    数据结构实验之链表七:单链表中重复元素的删除
    数据结构实验之栈一:进制转换
  • 原文地址:https://www.cnblogs.com/jy107600/p/7003714.html
Copyright © 2011-2022 走看看