JDK版本:1.7
1,使用构造方法或者addAll()方法批量加入某个Collection的元素时,为了效率考虑,是调用目标的toArray()方法,然后批量数组复制的。
2,在添加单个元素或批量添加元素时,都要检查一下确保数组可以容纳本次操作所要添加的数目,必要时扩展数组。
3,扩展数组时做到“一步到位”,在“容纳本次添加操作的最小数组长度”和“当前数组长度的1.5倍”之间取最大值。
4,为效率考虑,contains()、indexOf()和lastIndexOf()方法采用的是数组循环遍历,而不是调用自身的迭代器。
5,调用clone()后的新对象,修改计数器modCount会被重置为0.
6,数组从某一位置起批量移动的时候调用System.arraycopy(),源数组与目标数组为同一个,指定起始位置和偏移量即可。
7,与移除元素有关的方法仅仅是将目标位置设为null,其余的交给GC。
8,调用clear()之后,数组长度不变,只是改了引用和size——必要时可以调用trimToSize()来缩小数组到真实容量。
9,调用removeAll()和retainAll()取空集和交集时,在自身的数组上遍历,用遍历过的部分当作新的存储空间,需要读写指针各一个。
1 private boolean batchRemove(Collection<?> c, boolean complement) {
2 final Object[] elementData = this.elementData;
3 int r = 0, w = 0;
4 boolean modified = false;
5 try {
6 for (; r < size; r++)
7 if (c.contains(elementData[r]) == complement)
8 elementData[w++] = elementData[r];
9 } finally {
10 // Preserve behavioral compatibility with AbstractCollection,
11 // even if c.contains() throws.
12 if (r != size) {
13 System.arraycopy(elementData, r,
14 elementData, w,
15 size - r);
16 w += size - r;
17 }
18 if (w != size) {
19 for (int i = w; i < size; i++)
20 elementData[i] = null;
21 modCount += size - w;
22 size = w;
23 modified = true;
24 }
25 }
26 return modified;
27 }
这里没看懂的是方法第一行为什么要声明一个“final”的引用,代码结构上完全可以去掉,是为了执行效率?
10,内部数组是transient类型的,不会被自动序列化。序列化时会将“数组长度值”和“顺序排列的数组元素流”依次跟在“默认ArrayList对象流”后面。
11,每次内容修改都会更改modCount计数器。迭代器初始化时复制此计数器,之后每次迭代都检查此计数器以实现快速失败特性。
12,subList只是一个指向parentList的包装视图,且可以多层包装。