ArrayList源代码阅读笔记

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了两次。

你可能感兴趣的:(ArrayList)