1, 其实有两个ArrayList。一个是java.util包下面的。一个java.utils.Collections这个工具类内部类。后者其实只是Collections一系列方法的返回对象.
2,ArrayList继承的接口有List,RandomAccess和Conable和serializable 。换句话说。其没有其他的集合语义。
3,成员变量只有elementData和size两个成员变量。觉得还是简单的。这也就意味着,elementData是全部存储对象的。没有任何的保存不再的东西的可能性。
4,构造函数分两类。
一类是无参和(int), 其实就是一个初始化elementData的长度。无参的默认长度为10
另一位是(Collection): 用了Collection.toArray进行转换。不过后面看了一段
// c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); }
bug的论述在
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6260652
其实这里主要是奇怪。因为觉得这里觉得如果就算是保存了非Object的数组,也不会有什么问题。上网问了一下,会出这样的一个问题。实例代码如下:
List<Object> l = new ArrayList<Object>(Arrays.asList("foo", "bar")); // Arrays.asList("foo", "bar").toArray() produces String[], // and l is backed by that array l.set(0, new Object()); // Causes ArrayStoreException, because you cannot put // arbitrary Object into String[]
5,TrimToSize:内存紧张的时候会用到
ensureCapacity:扩充数组长度。扩展长度是原长度old×1.5+1。如果不够,就直接那个长度。
6,IndexOf和lastIndexOf。重写了一下,直接访问数组。觉得Iterator其实性能上不好。只是语义上与Collection相对
7, 重写了clone方法,其实就是数组copy加上modCount重置。
8,toArray(T[] a)觉得实现有点怪。具体规则为。
如果a的size小于List的size,那么就返回一个新的数组。不影响a。
反之,a的size大于List。那么就是把list全部Copy到a,然后在List的size的位置,把其设为null。后面的数据不变,然后返回a。换句话说影响了a。
所以觉得,还是怎么说呢,创建一个新的a,空的a丢进去。比较保险。因为都是用了复制。就是多了一个创建的性能消耗
9,Modfiy方法的都有一个rangcheck方法。
10,add(Index,element)方法,就是会使用System中copy数组的方法。
11,remove方法,是用equal进行判断的。remove第一出线的。调用了一个fastRemove的内部方法,其省去了边界检查。其实也还是很System copy
12.addAll(collection)只是copy了一次数组,addALL(index,collection)则copy了两次。