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 办法,以缩小增量重新分配的次数