ArrayList源码分析(1.8)
2019-10-29 本文已影响0人
台风口的猪
基本属性
// 初始化默认容器大小
private static final int DEFAULT_CAPACITY = 10;
ArrayList的扩容
1.当添加第一个元素时,将扩展到默认容量。
默认容量大小为102. modCount++记录操作list 的次数,判断是否需要扩容
image3.如果需要扩容 (不需要扩容加表末尾)
image1处表示:新容量扩大到原容量(上一次扩容容量)的1.5倍,右移一位相关于原数值除以2
2处表示:真正扩容的地方
3.copy数据
通过Arrays.copyOf() 在其内部创建了一个新的数组,然后调用arrayCopy()向其复制内容,返回出去,
数据copy过程
1.copyOf()的实现是用的是arrayCopy();
2.arrayCopy()需要目标数组,对两个数组的内容进行可能不完全的合并操作。
3.copyOf()在内部新建一个数组,调用arrayCopy()将original内容复制到copy中去,并且长度为newLength。返回copy;
image image
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。
3.1 ArrayList有容量上限吗?
ArrayList是有最大容量的,最大为Integer.MAX_VALUE,即((2^31)-1)2147483647
有些虚拟机在阵列中保留一些头信息,防止内存溢出,
此时,我们发现ArrayList最大容量是(Integer.MAX_VALUE-8)