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

源码学习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文章的建议)。
另外,如果大家有兴趣转载,请注明原文出处,谢谢!


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值