8 arraylist

Posted cathy_mu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8 arraylist相关的知识,希望对你有一定的参考价值。

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 方法,以减少增量重新分配的次数

以上是关于8 arraylist的主要内容,如果未能解决你的问题,请参考以下文章

获取 Intent 片段上的 Serializable ArrayList

包含不同片段的HashMap(或ArrayList)

面试常用的代码片段

VSCode自定义代码片段8——声明函数

回收站视图未显示在片段中

从ViewPager android替换片段