隨筆 - 22, 文章 - 0, 評論 - 1, 引用 - 0
          數(shù)據(jù)加載中……

          ArrayList的源碼閱讀筆記

          JDK版本:1.7
          1,使用構造方法或者addAll()方法批量加入某個Collection的元素時,為了效率考慮,是調(diào)用目標的toArray()方法,然后批量數(shù)組復制的。
          2,在添加單個元素或批量添加元素時,都要檢查一下確保數(shù)組可以容納本次操作所要添加的數(shù)目,必要時擴展數(shù)組。
          3,擴展數(shù)組時做到“一步到位”,在“容納本次添加操作的最小數(shù)組長度”和“當前數(shù)組長度的1.5倍”之間取最大值。
          4,為效率考慮,contains()、indexOf()和lastIndexOf()方法采用的是數(shù)組循環(huán)遍歷,而不是調(diào)用自身的迭代器。
          5,調(diào)用clone()后的新對象,修改計數(shù)器modCount會被重置為0.
          6,數(shù)組從某一位置起批量移動的時候調(diào)用System.arraycopy(),源數(shù)組與目標數(shù)組為同一個,指定起始位置和偏移量即可。
          7,與移除元素有關的方法僅僅是將目標位置設為null,其余的交給GC。
          8,調(diào)用clear()之后,數(shù)組長度不變,只是改了引用和size——必要時可以調(diào)用trimToSize()來縮小數(shù)組到真實容量。
          9,調(diào)用removeAll()和retainAll()取空集和交集時,在自身的數(shù)組上遍歷,用遍歷過的部分當作新的存儲空間,需要讀寫指針各一個。
           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”的引用,代碼結(jié)構上完全可以去掉,是為了執(zhí)行效率?
          10,內(nèi)部數(shù)組是transient類型的,不會被自動序列化。序列化時會將“數(shù)組長度值”和“順序排列的數(shù)組元素流”依次跟在“默認ArrayList對象流”后面。
          11,每次內(nèi)容修改都會更改modCount計數(shù)器。迭代器初始化時復制此計數(shù)器,之后每次迭代都檢查此計數(shù)器以實現(xiàn)快速失敗特性。
          12,subList只是一個指向parentList的包裝視圖,且可以多層包裝。

          posted on 2012-09-07 18:50 王星游 閱讀(268) 評論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 大余县| 中西区| 紫金县| 保亭| 黑龙江省| 德江县| 广昌县| 桂平市| 武乡县| 清流县| 周宁县| 常德市| 布尔津县| 海淀区| 翁牛特旗| 海伦市| 南和县| 玉门市| 洛南县| 东源县| 招远市| 商都县| 小金县| 罗田县| 历史| 四川省| 锡林浩特市| 托里县| 武宣县| 绥化市| 同仁县| 虎林市| 龙陵县| 岢岚县| 龙口市| 民权县| 汝州市| 盐边县| 商城县| 砚山县| 望都县|