ArrayList是通过一个数组来实现的,因此它是在连续的存储位置存放对象的引用,只不过它比数组更智能,能够根据集合长度进行自动扩容。
假设让我们来实现一个简单的能够自动扩容的数组,我们最容易想到的点就是:
-
<李> add()的时候需要判断当前数+ 1组大小是否等于此时定义的数组大小,李>
<李>若小于直接添加即可,否则,需要先扩容再进行添加。李>
实际上,ArrayList的内部实现原理也是这样子,我们可以来研究分析一下ArrayList的源码
/* * *添加指定的元素的列表。 * * @param e元素附加到这个列表 * @return & lt; tt> true</tt>(按照{@link收集#添加}) */公共逻辑加(E E) { ensureCapacityInternal(+ 1)大小;//进行扩容校验 elementData(大小+ +)=e;//将值添加到数组后面,并将尺寸+ 1 返回true; }/* * * ArrayList的元素的数组缓冲区存储。 * ArrayList的容量是这个数组的长度缓冲区。任何 *空ArrayList elementData=https://www.yisu.com/zixun/=DEFAULTCAPACITY_EMPTY_ELEMENTDATA *将扩展到DEFAULT_CAPACITY当第一个元素被添加。 */瞬态对象[]elementData;//采用简化嵌套类访问 私人空间ensureCapacityInternal (int minCapacity) { ensureExplicitCapacity (calculateCapacity (elementData minCapacity));//elementData数组 }/* * *默认初始容量。 */私有静态最终int DEFAULT_CAPACITY=10;/* * *共享空数组实例用于默认大小的空实例。我们 *区分从EMPTY_ELEMENTDATA知道膨胀的时候 *第一个元素被添加。 */私有静态最终对象[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA={};//返回最大的索引 私有静态int calculateCapacity (Object [] elementData, int minCapacity) { 如果(elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA){//与空数组实例对比 返回数学。马克斯(DEFAULT_CAPACITY minCapacity); } 返回minCapacity; } 私人空间ensureExplicitCapacity (int minCapacity) { modCount + +;//overflow-conscious代码 如果(minCapacity - elementData。长度> 0) 成长(minCapacity); }
扩容调用方法,实际也就是数组复制的过程
/* * *增加的能力,以确保它可以容纳至少 *最低容量参数指定的元素数量。 * * @param minCapacity所需的最小容量 */私人空间增长(int minCapacity) {//overflow-conscious代码 int oldCapacity=elementData.length; int newCapacity=oldCapacity + (oldCapacity祝辞祝辞1); 如果(newCapacity - minCapacity & lt;0) newCapacity=minCapacity; 如果(newCapacity - MAX_ARRAY_SIZE祝辞0) newCapacity=hugeCapacity (minCapacity);//minCapacity通常是接近的大小,这是一个胜利: elementData=https://www.yisu.com/zixun/Arrays.copyOf (elementData newCapacity); }
/* * *插入指定元素在指定的位置 *列表。变化的元素目前位置(如果有的话) *任何后续元素向右(添加alt=癑ava集合系列(二)ArrayList详解">以上所述是小编给大家介绍的Java集合系列ArrayList详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
Java集合系列(二)ArrayList详解