通过源码看ArrayList底层是如何扩容的。
ArrayList有两个属性,存储数据的数组elementData,和存储记录数目的size(真实有效的个数)。
Vector有三个属性,存储数据的数组elementData,存储记录数目的elementCount,还有扩展数组大小的扩展因子capacityIncrement。
一、初始化
二、add元素
ensureCapacityInternal(size + 1); 此时size 就是0,ensureCapacityInternal(1);
因为elementData是默认值,所以进入if流程,那么minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);就等于DEFAULT_CAPACITY的值10。
继续往下走,ensureExplicitCapacity(10)。此时进入if流程,进行扩容。最终返回的就是长度为10的数组。
最终添加数据完成,elementData从第0个元素开始。
三、addAll(int index,Collection()T)
这里请记住非常重要的一点:size指的是真是存在数组中的元素个数,而不是elementData的个数。
通过上面的分析过程可以得知 ensureCapacityInternal(size + numNew); 是不需要扩容的。
那么首先判断是否需要移动elementData中的数据,答案是显而易见的。
此时形成的elementData = {"a","b","c","b","c",null,"","","",""};
下面就进入第二次的数组copy过程。
最终形成我们所需要的数据elementData = {"a","VV","CC","b","c",null,"","","",""};
相关推荐
- 如果对数组的动态大小调整有较高需求,可以考虑使用ArrayList代替原始数组,ArrayList在底层实现了动态扩容机制,对开发者来说更便捷。 6. 内存管理: - 扩容后,旧数组不会立即被垃圾回收,只有当所有引用都...
ArrayList扩容原理 ArrayList集合的底层是数组,特点是查询快增删慢。当创建一个集合时,ArrayList集合的空参构造底层数组默认长度为 0,即new Object[0]。当添加第一个元素时,掉用了ArrayList集合的add(E e)方法...
在添加元素(add 方法)时,ArrayList 的动态扩容机制非常重要。当数组空间不足时,ArrayList 会自动扩大其容量。扩容策略通常是将当前容量(oldcapa)乘以1.5,即 oldcapa * 1.5。这样做的目的是在保证性能的同时...
`grow(minCapacity)`是ArrayList扩容的核心方法,它会计算新的容量大小,通常是旧容量的1.5倍加上2。这样做的目的是为了平衡插入元素的成本和空间浪费。例如,如果当前容量是10,当需要添加第11个元素时,容量会增加...
本资源根据个人学习和总结,主要介绍Java中ArrayList扩容机制源码的解析,主要包含文字和代码等内容,以源码的形式进行分析,详细介绍了ArrayList扩容机制的整个流程,特此将该资源分享
在Java中,ArrayList是最常用的集合类之一,它提供了动态扩容的功能,能够自动地根据添加元素的数量来调整内部数组的大小,以满足元素的存储需求。今天,我们将深入探讨ArrayList的自动扩容机制,了解它是如何工作的...
当我们向ArrayList中添加元素时,如果当前容量不足,ArrayList会自动扩容。这个过程涉及到数组的复制,因此在插入操作上,ArrayList的性能并不高效,特别是当插入位置位于数组中间时。但ArrayList在随机访问元素时...
"Java使用数组实现ArrayList的动态扩容的方法" Java中的ArrayList是使用数组实现的,但是数组有一个缺点,就是在创建时就确定了长度,之后就不能更改长度。因此,Java官方提供了ArrayList这个可变长的容器。...
Arraylist扩容原理走读
在动态空间管理中,递增式扩容是一种常见的策略。当数组的当前容量不足以容纳新插入的元素时,程序会自动扩大数组的大小。这种扩容通常不是简单地增加一个元素的空间,而是选择一个更大的容量值,以减少频繁扩容带来...
ArrayList及HashMap的扩容规则讲解 ArrayList及HashMap是Java中两个常用的数据结构,分别用于存储数组和键值对数据。今天,我们将深入探讨ArrayList及HashMap的扩容规则,以便更好地理解它们的工作机制。 一、...
"Java ArrayList扩容问题实例详解" Java ArrayList扩容问题实例详解是Java编程语言中一个非常重要的知识点。ArrayList是Java中最常用的集合类之一,它提供了动态数组的功能,可以存储大量的数据。但是,ArrayList在...
- **扩容策略**: `ArrayList`的扩容策略不是固定的,但添加元素的操作具有常数级别的平均时间复杂度。 #### 内部实现 1. **基础结构**: - `ArrayList`内部通过一个`Object[]`数组`elementData`来存储数据。 - ...
默认初始容量为10,随着元素的增加,ArrayList会自动进行扩容操作。这个过程涉及到内部数组的复制,可能导致性能开销。因此,如果预先知道所需容量,可以在创建ArrayList时指定初始容量,减少不必要的扩容操作。此外...
在 Java 语言中,ArrayList 是一个非常常用的集合类,它的底层实现是一个动态扩容的数组。当我们向 ArrayList 中添加元素时,如果数组的容量不足以容纳所添加的元素,那么 ArrayList 就会扩容以容纳新的元素。在 JDK...
ArrayList是Java集合框架中常用的动态数组,它...同时,了解ArrayList的工作原理,如其内部数组的动态扩容机制,有助于避免潜在的性能瓶颈。记住,学习ArrayList不仅是掌握方法,更是理解其在不同场景下的最佳实践。
Java中的ArrayList类就是基于动态数组实现的,它在扩容时会创建一个新的更大容量的数组,然后将原有元素复制到新数组中。这个过程的时间复杂度为O(n),其中n为原数组的元素数量。因此,频繁的扩容操作会带来性能开销...
在提供的代码文件中,`VariableLengthArrayList.java`可能是实现动态数组的类,它可能包含上述的初始化、扩容、插入和删除等方法。`ListInterface.java`可能定义了一个接口,描述了线性表应具备的基本操作,如`add()...