ArrayList底层是用数组实现,但数组长度是有限的,如何实现扩容?

简介: ArrayList底层是用数组实现,但数组长度是有限的,如何实现扩容?

ArrayList底层是用数组实现,但数组长度是有限的,如何实现扩容?


当新增元素,ArrayList放不下该元素时,触发扩容。 扩容的容量将会是原容量的1/2,也就是新容量是旧容量的1.5倍。

private void grow(int minCapacity) { 
  int oldCapacity = elementData.length; 
  //新容量=旧容量+1/2旧容量 
  int newCapacity = oldCapacity + (oldCapacity >> 1); 
  if (newCapacity - minCapacity < 0) 
    newCapacity = minCapacity; 
  if (newCapacity - MAX_ARRAY_SIZE > 0) 
    newCapacity = hugeCapacity(minCapacity); 
  elementData = Arrays.copyOf(elementData, newCapacity); 
}

执行扩容时使用系统类System的数组复制方法arraycopy()进行扩容。

扩容的源码:

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { 
  @SuppressWarnings("unchecked") 
  T[] copy = ((Object)newType == (Object)Object[].class) 
  ? (T[]) new Object[newLength] 
  : (T[]) Array.newInstance(newType.getComponentType(), newLength);
   System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); 
   return copy; 
}
相关文章
|
6月前
|
存储 Java
ArrayList的初始化容量与扩容机制解析
ArrayList的初始化容量与扩容机制解析
|
存储 算法 Java
HashMap 之底层数据结构和扩容机制
HashMap 之底层数据结构和扩容机制
914 1
|
1月前
|
存储 缓存 索引
从底层数据结构和CPU缓存两方面剖析LinkedList的查询效率为什么比ArrayList低
本文详细对比了ArrayList和LinkedList的查询效率,从底层数据结构和CPU缓存两个方面进行分析。ArrayList基于动态数组,支持随机访问,查询时间复杂度为O(1),且CPU缓存对其友好;而LinkedList基于双向链表,需要逐个节点遍历,查询时间复杂度为O(n),且CPU缓存对其帮助不大。文章还探讨了CPU缓存对数组增删操作的影响,指出缓存主要作用于读取而非修改。通过这些分析,加深了对这两种数据结构的理解。
35 2
|
Java
ArrayList扩容机制的相关面试题
ArrayList扩容机制的相关面试题
67 1
|
存储 安全 Java
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
|
6月前
|
存储 安全 Java
ArrayList相对于数组与链表使用的优点与开发过程中的缺点
ArrayList相对于数组与链表使用的优点与开发过程中的缺点
38 0
【面试:基础篇06:ArrayList扩容机制】
【面试:基础篇06:ArrayList扩容机制】
150 0
|
存储 Java
深入理解ArrayList的动态扩容机制及应用
在java编程中,数据结构起着至关重要的作用,而ArrayList作为一种常用的动态数组,为我们在处理数据时提供了便利。其中,其独特的动态扩容机制更是为其赢得了广泛的应用。我们不管在工作还是面试中,都会遇到ArrayList,本文将深入探讨ArrayList的动态扩容机制,以便我们在工作或者面试中用到。
182 0
深入理解ArrayList的动态扩容机制及应用
|
Java
4.1 Java数组性能优化策略:合理选择数组大小与容量
4.1 Java数组性能优化策略:合理选择数组大小与容量
192 0