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的包裝視圖,且可以多層包裝。