ArrayList的学习总结

来源:互联网 发布:网络教育学生档案 编辑:程序博客网 时间:2024/06/05 17:16

             1、ArrayList有三个构造函数,其中默认构造函数的ArrayList的容量为10,带有Collection参数的构造方法,将Collection转化为数组赋给ArrayList的实现数组elementData

        2、ArrayList的ensureCapacity方法增加容量时,是根据oldCapacity*3/2=1,即增到到原来的1.5倍,而vector增加1倍。

当容量不够时,每次增加元素,都要将原来的元素拷贝到一个新的数组中,非常之耗时,也因此建议在事先能确定元素数量的情况下,才使用ArrayList,否则建议使用LinkedList。

       3、ArrayList的实现中大量地调用了Arrays.copyof()和System.arraycopy()方法。我们有必要对这两个方法的实现做下深入的了解。

    首先来看Arrays.copyof()方法。它有很多个重载的方法,但实现思路都是一样的,

public static <T> T[] copyOf(T[] original, int newLength) {      return (T[]) copyOf(original, newLength, original.getClass());  }

很明显调用了另一个copyof方法,该方法有三个参数,最后一个参数指明要转换的数据的类型,其源码如下:

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {      T[] copy = ((Object)newType == (Object)Object[].class)          ? (T[]) new Object[newLength]          : (T[]) Array.newInstance(newType.getComponentType(), newLength);      System.arraycopy(original, 0, copy, 0,                       Math.min(original.length, newLength));      return copy;  } 

这里可以很明显地看出,该方法实际上是在其内部又创建了一个长度为newlength的数组,调用System.arraycopy()方法,将原来数组中的元素复制到了新的数组中。

    下面来看System.arraycopy()方法。该方法被标记了native,调用了系统的C/C++代码,在JDK中是看不到的,但在openJDK中可以看到其源码。该函数实际上最终调用了C语言的memmove()函数,因此它可以保证同一个数组内元素的正确复制和移动,比一般的复制方法的实现效率要高很多,很适合用来批量处理数组。Java强烈推荐在复制大量数组元素时用该方法,以取得更高的效率。

4、ArrayList基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低。

5、在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,ArrayList中允许元素为null。


原创粉丝点击