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; 
}
相关文章
|
存储 算法 Java
HashMap 之底层数据结构和扩容机制
HashMap 之底层数据结构和扩容机制
1117 1
|
5月前
|
存储 缓存 索引
从底层数据结构和CPU缓存两方面剖析LinkedList的查询效率为什么比ArrayList低
本文详细对比了ArrayList和LinkedList的查询效率,从底层数据结构和CPU缓存两个方面进行分析。ArrayList基于动态数组,支持随机访问,查询时间复杂度为O(1),且CPU缓存对其友好;而LinkedList基于双向链表,需要逐个节点遍历,查询时间复杂度为O(n),且CPU缓存对其帮助不大。文章还探讨了CPU缓存对数组增删操作的影响,指出缓存主要作用于读取而非修改。通过这些分析,加深了对这两种数据结构的理解。
80 2
|
存储 安全 Java
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
|
10月前
|
存储 算法
轮转数组问题:如何实现数组“整体逆序,内部有序”?“三步转换法”妙转数组(一)
这篇内容讲述了数组向右轮转k个位置的问题,主要分为两种解决思路。第一种是“轮转k次法”,直接在原数组上操作,每次循环k次,将数组末尾元素移到开头,时间复杂度为O(N*K),效率较低。第二种是“额外数组法”,使用额外数组存储部分元素,然后移动原数组元素,最后归还额外数组元素,时间复杂度和空间复杂度均为O(N)。文章还介绍了更高效的“三步转换法”,通过三次逆序操作实现数组轮转,分别是逆置后k个元素、逆置前n-k个元素以及整体逆置,这种方法时间复杂度为O(N)且空间复杂度为O(1)。
107 1
|
9月前
|
存储 NoSQL Redis
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
|
10月前
|
C语言
轮转数组问题:如何实现数组“整体逆序,内部有序”?“三步转换法”妙转数组 (二)
这是一个关于字符串处理的问题,要求将一句话中的单词顺序倒置,但保持单词内部的字符顺序不变。例如,"I like beijing." 变为 "beijing. like I"。解决方法可以分为三个步骤:分块、内部逆序和整体逆序。代码示例使用C语言实现,通过指针和while循环操作字符串数组。最终总结提到,无论先逆置哪个部分,只要确保所有部分都逆置过,结果都是相同的。
73 0
|
10月前
|
存储 算法
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
70 0
|
10月前
|
存储 安全 Java
ArrayList相对于数组与链表使用的优点与开发过程中的缺点
ArrayList相对于数组与链表使用的优点与开发过程中的缺点
56 0
|
存储 Java 索引
深入了解java集合框架-List集合以及选用
List List实现了Collection,所以他拥有Collection的全部方法
|
存储 算法 大数据
内存受限下找出亿级整数集合中的不重复元素
内存受限下找出亿级整数集合中的不重复元素
82 0

热门文章

最新文章