java类库的阅读笔记_jdk1.7.0_40_java.util.ArrayList

来源:互联网 发布:overture mac 编辑:程序博客网 时间:2024/06/05 15:40

2013 1025

类:

java.util.ArrayList

笔记:

这个类用数组存储数据,和LinkedList的区别,就是读写数据。

数据读取:

ArrayList实现了RandomAccess,代表着直接用下标取数据,时间消耗是O(1)。

容量增长:

private void grow(int minCapacity),将现有容量乘以1.5倍,与minCapacity对比,取较大值作为新数组的容量。

private void ensureExplicitCapacity(int minCapacity),对比minCapacity和现有容量,如果minCapacity参数比现有容量大,则调用grow,否则直接退出。

更外层的包装方法public void ensureCapacity(int minCapacity)和private void ensureCapacityInternal(int minCapacity)则特殊处理了在原始无数据情况下的容量问题。即保证扩容以后,容量至少为DEFAULT_CAPACITY = 10。

数据增加:

单个增加的话,很简单的用实际数据量size+1去尝试扩容,如果容量尚够,就不会有扩容操作,如果确实触发了扩容,容量会增长到1.5倍。

批量增加的话,同样先尝试扩容,然后调用System.arraycopy方法把新数据拷贝到数组中去。

数据删除:

数据删除不会减少容量。基本操作是,调用System.arraycopy方法,进行数据挪动;进行赋值空指针的方式,清空被删除的数据。

LinkedList查询慢,所以有了各种巧妙的指针挪移方法,ArrayList增删慢,所以有了System.arraycopy这种神器~

数组的数据删除很重要的点就是,必须对不再使用的数据位,进行赋空操作,否则可能导致内存泄露。

迭代保护:

LinkedList和ArrayList虽然不是线程安全的,但是至少单线程还是比较安全的。这种安全,主要在于迭代器有进行保护,避免了出现单线程编程上的陷阱。

基本上所有的迭代器都会有这样一个方法:void checkForComodification() ,它的作用是在每次调用迭代器的各个方法时,首先执行一遍,查看迭代容器有没有进行了修改,如果有,就抛出异常。

实现方法是,迭代容器每次有修改动作的时候,都会将一个int型变量modCount+1,。迭代器生成的时候,会记录下当时的修改次数,而checkForComodification方法,就是去判断当前的修改次数,和记录的修改次数是否一致。

原创粉丝点击