关于arraylist:8-arraylist

13次阅读

共计 1268 个字符,预计需要花费 4 分钟才能阅读完成。

arraylist 线程不平安
底层是数组
反对快速访问 randomAccess
尾部有空余空间
在尾减少删除工夫复杂度都是 O(1),在指定地位减少删除工夫复杂度是 O(n),因为要一个一个挪
JDK7 new 无参结构的 ArrayList 对象时,间接创立了长度是 10 的 Object[] 数组 elementData。jdk7 中的 ArrayList 的对象的创立相似于单例的饿汉式,而 jdk8 中的 ArrayList 的对象的创立相似于单例的懒汉式。

扩容过程
未指定初始容量的 arraylist 创立进去,容量是 0
add 元素进来时,判断外部容量是否足够(外部容量 > 以后 size+1)
判断外部容量是否足够 n 时,如果 arraylist 是空的,将容量裁减到 max(10,n),如果 arraylist 不是空的,看看容量够不够 n,不够就扩容到 n
扩容到 n 时,利用位运算将旧容量扩容到 1.5 倍,新容量 =max(1.5 倍旧容量,n)。
如果 max(1.5 倍旧容量,n)>maxInteger-8 && n>maxInteger-8,新容量 =maxInteger
如果 max(1.5 倍旧容量,n)>maxInteger-8 && n<maxInteger-8,新容量 =maxInteger-8

java 中的 length 属性是针对数组说的, 比如说你申明了一个数组, 想晓得这个数组的长度则用到了 length 这个属性.
java 中的 length() 办法是针对字符串说的, 如果想看这个字符串的长度则用到 length() 这个办法.
java 中的 size() 办法是针对泛型汇合说的, 如果想看这个泛型有多少个元素, 就调用此办法来查看!

在此列表中的指定地位插入指定的元素。
先调用 rangeCheckForAdd 对 index 进行界线查看;而后调用 ensureCapacityInternal 办法保障 capacity 足够大;
再将从 index 开始之后的所有成员后移一个地位;将 element 插入 index 地位;最初 size 加 1。

System.arraycopy()是一个 native 办法, 用来 add 的时候一个一个挪

 /**
*   复制数组
* @param src 源数组
* @param srcPos 源数组中的起始地位
* @param dest 指标数组
* @param destPos 指标数组中的起始地位
* @param length 要复制的数组元素的数量
*/
public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);
                                    

把 src 数组,在第 srcPos 地位插入新数据,后边的挨个挪一个

Arrays.copyOf()办法 申请一个新的数组。调用 System.arraycopy, 将源数组中的数据进行拷贝, 并返回新的数组

ensureCapacity 办法,如有必要,减少此 ArrayList 实例的容量,以确保它至多能够包容由 minimum capacity 参数指定的元素数。最好在 add 大量元素之前用 ensureCapacity 办法,以缩小增量重新分配的次数

正文完
 0