您的位置:首页 > 编程语言 > Java开发

JDK1.6 源码学习笔记(二)

2012-03-19 11:38 330 查看
源码学习JDK版本:JDK1.6





第二节:java.util.ArrayList


1.ArrayList都会有一个默认容量,且容量大小是自动变化的,以满足放入的内容的个数。

容量默认的大小是10(JDK1.6).并且,当有新元素加入时,会调用ensureCapacity()来维护数组的大小。从ensureCapacity()方法中,可以看到,当要增加数组大小时,默认都是按照原来数组大小的1.5倍增加。

int newCapacity = (oldCapacity * 3)/2 + 1;

2.ArrayList类的属性有:

private transient Object[] elementData;
private int size;


注意:size不一定等于elementData.length,很多时候,size<elementData.length。


因此,ArrayList提供了方法trimToSize,用来减去没有使用的空间。

3.有关于ArrayList结构的改变,会引发一些相关的问题:

结构改变包括:向ArrayList添加、删除元素,或者明确的手动修改数组大小。如果仅仅是给一个元素赋值,不属于结构的改变。

结构改变引起的问题:

可能导致Iterator报ConcurrentModificationException异常。

注意:当ArrayList使用了iterator()方法产生自身对应的Iterator后,只能使用Iterator自身的remove和add方法来修改ArrayList的结构,其它的修改都会引起ConcurrentModificationException异常,如ArrayList.add(E e)、ArrayList.remove(int index)等。

ArrayList使用AbstractList.modCount(初始的默认值为0)作为结构改变的标示。在ArrayList中,凡是会引起ArrayList结构变化的方法,都会修改modCount(modCount++),以区别是否修改了ArrayList的结构。

如果是对ArrayList的Iterator做修改,在Iterator中会重置expectedModCount=modCount,这样就可以保证在生成Iterator后,只能由Iterator来修改对应的ArrayList的结构。如果此时,ArrayList修改了自身的结构,那么expectedModCoun==modCount将会返回false,从而Iterator会抛出ConcurrentModificationException异常。

关于这一点中提到的Iterator的论述,后面的java.util.AbstractList的源码解读中的会有相关说明。



4.继承自java.util.AbstractList(关于AbstractList的讨论将留到下一节)


5.Vector是同步的;ArrayList不是同步的。(后期看Vector的时候再讨论)

本人的第二篇JDK源码阅读的文章到此结束,希望大家指出其中的不足(包括源码解读的错误,也包括blog文章的建议)。

另外,如果大家有兴趣转载,请注明原文出处,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: