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 之底层数据结构和扩容机制
923 1
|
1月前
|
存储 缓存 索引
从底层数据结构和CPU缓存两方面剖析LinkedList的查询效率为什么比ArrayList低
本文详细对比了ArrayList和LinkedList的查询效率,从底层数据结构和CPU缓存两个方面进行分析。ArrayList基于动态数组,支持随机访问,查询时间复杂度为O(1),且CPU缓存对其友好;而LinkedList基于双向链表,需要逐个节点遍历,查询时间复杂度为O(n),且CPU缓存对其帮助不大。文章还探讨了CPU缓存对数组增删操作的影响,指出缓存主要作用于读取而非修改。通过这些分析,加深了对这两种数据结构的理解。
40 2
|
1月前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
24 3
|
存储 安全 Java
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
|
6月前
|
Java 索引
HashMap的扩容看这一篇足够
HashMap的扩容看这一篇足够
82 2
|
6月前
|
存储 算法
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
53 0
|
6月前
|
存储 安全 Java
ArrayList相对于数组与链表使用的优点与开发过程中的缺点
ArrayList相对于数组与链表使用的优点与开发过程中的缺点
38 0
|
Java
4.1 Java数组性能优化策略:合理选择数组大小与容量
4.1 Java数组性能优化策略:合理选择数组大小与容量
195 0
|
Java 大数据