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方法,就是去判断当前的修改次数,和记录的修改次数是否一致。
- java类库的阅读笔记_jdk1.7.0_40_java.util.ArrayList
- java类库的阅读笔记_jdk1.7.0_40_java.util.Collections
- java类库的阅读笔记_jdk1.7.0_40_java.util.LinkedList
- java类库的阅读笔记_jdk1.7.0_40_java.util.HashMap
- java类库的阅读笔记_jdk1.7.0_40_java.util.concurrent.locks.LockSupport
- java类库的阅读笔记_jdk1.7.0_40_java.util.concurrent.locks.AbstractQueuedSynchronizer
- java类库的阅读笔记_jdk1.7.0_40_java.util.concurrent.locks.ReentrantReadWriteLock
- java类库的阅读笔记_jdk1.7.0_40_java.util.concurrent.ConcurrentHashMap
- java类库的阅读笔记_jdk1.7.0_40_java.util.Timer
- java类库的阅读笔记_jdk1.7.0_40_java.io.Serializable
- java类库的阅读笔记_jdk1.7.0_40_java.io.FileInputStream
- JAVA 集合类(java.util)源码阅读笔记------ArrayList
- ArrayList的阅读笔记
- ArrayList的阅读笔记
- ArrayList的阅读笔记
- 【java】java.util.ArrayList类
- java.util.ArrayList学习笔记(一)
- java.util.ArrayList学习笔记(二)
- C语言常用链表操作
- windows xp系统下Android模拟器安装apk与卸载apk
- c++和java中关于如何调用父类方法和子类方法的辨析
- android开发之wifi网络操作初步
- jdk 1.5新特性——泛型
- java类库的阅读笔记_jdk1.7.0_40_java.util.ArrayList
- So cute are you Python 13
- ffmpeg开发中的问题(八)
- Python中__init__(),__getitem__()和__setitem__()的使用实例
- 内存分配方式,堆区,栈区,new/delete/malloc/free
- C/C++中extern关键字详解
- 从此刻起,认真的生活下去
- android开发之socket通信 向PC机发信息 获取本机IP
- DHCP服务