随笔 - 22, 文章 - 0, 评论 - 1, 引用 - 0
数据加载中……

ArrayList的源码阅读笔记

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的包装视图,且可以多层包装。

posted on 2012-09-07 18:50 王星游 阅读(257) 评论(0)  编辑  收藏 所属分类: java


只有注册用户登录后才能发表评论。


网站导航: