`
黑熊精
  • 浏览: 3291 次
社区版块
存档分类
最新评论

ArrayList -动态扩容

阅读更多

通过源码看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,"","","",""};

 

  • 大小: 7.1 KB
  • 大小: 50.9 KB
  • 大小: 4.9 KB
  • 大小: 3.4 KB
  • 大小: 9.6 KB
  • 大小: 12.4 KB
  • 大小: 7.6 KB
  • 大小: 15.1 KB
  • 大小: 3.8 KB
  • 大小: 12.4 KB
  • 大小: 7.7 KB
0
1
分享到:
评论

相关推荐

    Java 实例 - 数组扩容源代码-详细设计教程.zip

    - 如果对数组的动态大小调整有较高需求,可以考虑使用ArrayList代替原始数组,ArrayList在底层实现了动态扩容机制,对开发者来说更便捷。 6. 内存管理: - 扩容后,旧数组不会立即被垃圾回收,只有当所有引用都...

    ArrayList集合与HashMap的扩容原来.docx

    ArrayList扩容原理 ArrayList集合的底层是数组,特点是查询快增删慢。当创建一个集合时,ArrayList集合的空参构造底层数组默认长度为 0,即new Object[0]。当添加第一个元素时,掉用了ArrayList集合的add(E e)方法...

    java——ArrayList-源码解析.docx

    在添加元素(add 方法)时,ArrayList 的动态扩容机制非常重要。当数组空间不足时,ArrayList 会自动扩大其容量。扩容策略通常是将当前容量(oldcapa)乘以1.5,即 oldcapa * 1.5。这样做的目的是在保证性能的同时...

    Java中Arraylist动态扩容方法详解

    `grow(minCapacity)`是ArrayList扩容的核心方法,它会计算新的容量大小,通常是旧容量的1.5倍加上2。这样做的目的是为了平衡插入元素的成本和空间浪费。例如,如果当前容量是10,当需要添加第11个元素时,容量会增加...

    ArrayList扩容机制源码解析.md

    本资源根据个人学习和总结,主要介绍Java中ArrayList扩容机制源码的解析,主要包含文字和代码等内容,以源码的形式进行分析,详细介绍了ArrayList扩容机制的整个流程,特此将该资源分享

    对Java ArrayList的自动扩容机制示例讲解

    在Java中,ArrayList是最常用的集合类之一,它提供了动态扩容的功能,能够自动地根据添加元素的数量来调整内部数组的大小,以满足元素的存储需求。今天,我们将深入探讨ArrayList的自动扩容机制,了解它是如何工作的...

    ArrayList-LinkedList-源码.rar

    当我们向ArrayList中添加元素时,如果当前容量不足,ArrayList会自动扩容。这个过程涉及到数组的复制,因此在插入操作上,ArrayList的性能并不高效,特别是当插入位置位于数组中间时。但ArrayList在随机访问元素时...

    Java使用数组实现ArrayList的动态扩容的方法

    "Java使用数组实现ArrayList的动态扩容的方法" Java中的ArrayList是使用数组实现的,但是数组有一个缺点,就是在创建时就确定了长度,之后就不能更改长度。因此,Java官方提供了ArrayList这个可变长的容器。...

    Arraylist扩容原理走读.png

    Arraylist扩容原理走读

    02-B-2 动态空间管理 & 02-B-3 递增式扩容1

    在动态空间管理中,递增式扩容是一种常见的策略。当数组的当前容量不足以容纳新插入的元素时,程序会自动扩大数组的大小。这种扩容通常不是简单地增加一个元素的空间,而是选择一个更大的容量值,以减少频繁扩容带来...

    ArrayList及HashMap的扩容规则讲解

    ArrayList及HashMap的扩容规则讲解 ArrayList及HashMap是Java中两个常用的数据结构,分别用于存储数组和键值对数据。今天,我们将深入探讨ArrayList及HashMap的扩容规则,以便更好地理解它们的工作机制。 一、...

    Java ArrayList扩容问题实例详解

    "Java ArrayList扩容问题实例详解" Java ArrayList扩容问题实例详解是Java编程语言中一个非常重要的知识点。ArrayList是Java中最常用的集合类之一,它提供了动态数组的功能,可以存储大量的数据。但是,ArrayList在...

    ArrayList源码Jdk1.8

    - **扩容策略**: `ArrayList`的扩容策略不是固定的,但添加元素的操作具有常数级别的平均时间复杂度。 #### 内部实现 1. **基础结构**: - `ArrayList`内部通过一个`Object[]`数组`elementData`来存储数据。 - ...

    java提高篇(二一)-----ArrayList.pdf

    默认初始容量为10,随着元素的增加,ArrayList会自动进行扩容操作。这个过程涉及到内部数组的复制,可能导致性能开销。因此,如果预先知道所需容量,可以在创建ArrayList时指定初始容量,减少不必要的扩容操作。此外...

    聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的

    在 Java 语言中,ArrayList 是一个非常常用的集合类,它的底层实现是一个动态扩容的数组。当我们向 ArrayList 中添加元素时,如果数组的容量不足以容纳所添加的元素,那么 ArrayList 就会扩容以容纳新的元素。在 JDK...

    Java基础-ArrayList方法全解(上).pdf

    ArrayList是Java集合框架中常用的动态数组,它...同时,了解ArrayList的工作原理,如其内部数组的动态扩容机制,有助于避免潜在的性能瓶颈。记住,学习ArrayList不仅是掌握方法,更是理解其在不同场景下的最佳实践。

    数组的扩容和链表结构.zip

    Java中的ArrayList类就是基于动态数组实现的,它在扩容时会创建一个新的更大容量的数组,然后将原有元素复制到新数组中。这个过程的时间复杂度为O(n),其中n为原数组的元素数量。因此,频繁的扩容操作会带来性能开销...

    用Java动态数组扩充实现线性表

    在提供的代码文件中,`VariableLengthArrayList.java`可能是实现动态数组的类,它可能包含上述的初始化、扩容、插入和删除等方法。`ListInterface.java`可能定义了一个接口,描述了线性表应具备的基本操作,如`add()...

Global site tag (gtag.js) - Google Analytics