java中arraylist扩容问题_Arraylist扩容机制[通俗易懂]

java中arraylist扩容问题_Arraylist扩容机制[通俗易懂]当我们要add进第1个元素到ArrayList时,elementData.length为0(因为还是一个空的list),因为执行了ensureCapacityInternal()方法,所以minCapacity此时为10。此时,minCapacity-elementData.length>0成立,所以会进入grow(minCapacity)方法。当add第…

大家好,又见面了,我是你们的朋友全栈君。

当我们要 add 进第1个元素到 ArrayList 时,elementData.length 为0 (因为还是一个空的 list),因为执行了 ensureCapacityInternal() 方法 ,所以 minCapacity 此时为10。此时,minCapacity – elementData.length > 0成立,所以会进入 grow(minCapacity) 方法。

当add第2个元素时,minCapacity 为2,此时e lementData.length(容量)在添加第一个元素后扩容成 10 了

直到添加第11个元素,minCapacity(为11)比elementData.length(为10)要大。进入grow方法进行扩容。扩大成容量的1.5倍

grow() 方法

/**

* 要分配的最大数组大小

*/

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE – 8;

/**

* ArrayList扩容的核心方法。

*/

private void grow(int minCapacity) {

// oldCapacity为旧容量,newCapacity为新容量

int oldCapacity = elementData.length;

//将oldCapacity 右移一位,其效果相当于oldCapacity /2,

//我们知道位运算的速度远远快于整除运算,整句运算式的结果就是将新容量更新为旧容量的1.5倍,

int newCapacity = oldCapacity + (oldCapacity >> 1);

//然后检查新容量是否大于最小需要容量,若还是小于最小需要容量,那么就把最小需要容量当作数组的新容量,

if (newCapacity – minCapacity < 0)

newCapacity = minCapacity;

// 如果新容量大于 MAX_ARRAY_SIZE,进入(执行) `hugeCapacity()` 方法来比较 minCapacity 和 MAX_ARRAY_SIZE,

//如果minCapacity大于最大容量,则新容量则为`Integer.MAX_VALUE`,否则,新容量大小则为 MAX_ARRAY_SIZE 即为 `Integer.MAX_VALUE – 8`。

if (newCapacity – MAX_ARRAY_SIZE > 0)

newCapacity = hugeCapacity(minCapacity);

// minCapacity is usually close to size, so this is a win:

elementData = Arrays.copyOf(elementData, newCapacity);

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134685.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • navicat激活码最新【2021.8最新】

    (navicat激活码最新)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月26日
    53
  • msfconsole攻击工具_服务器console接口是干嘛的

    msfconsole攻击工具_服务器console接口是干嘛的?Msfconsole工具概括:???Msfconsole简称(msf)是一款常用的渗透测试工具,包含了常见的漏洞利用模块和生成各种木马,方便于安全测试人员的使用.(1)进行端口扫描.(2)进行服务的扫描.(3)扫描3306(Mysql)端口的弱口令.(4)在msf模块里也可以使用nmap进行扫描.(5)扫描了服务器是用WinXP,然后对服务器进行渗透测试.

    2025年9月28日
    5
  • 显示适配器virtual display device_电脑怎么设置虚拟显示器

    显示适配器virtual display device_电脑怎么设置虚拟显示器根据包括微软研究院在内的许多最新研究,多显示器系统以及更大的显示器可将用户工作效率提高10%至50%。然而,多显示器采用的增长以及大屏幕显示器受到以下几个因素的影响:虚拟显示管理器通过额外的虚拟显示器的便利性来补充您现有的单显示器或多显示器系统,这些虚拟显示器可以细分现有的物理屏幕,同时使用现有硬件以及单击按钮调用不同显示器配置的能力。VDM的虚拟显示技术提供了物理显示器的外观和感觉,并且需要对最终用户进行最少的重新培训。许可证区别虚拟显示管理器提供两个不同的许可证。CL–控制台许可证和MUL

    2022年8月21日
    159
  • Ruby On Rails 4 hello world,Ruby On Rails上手

    Ruby On Rails 4 hello world,Ruby On Rails上手

    2021年11月29日
    40
  • Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从TokenStream流中获取.分词器的核心类Analyzer,TokenStream,Tokenizer,TokenFilter.AnalyzerLucene中的分词器有Stand…

    2022年7月22日
    9
  • 非线性最小二乘问题例题_非线性自适应控制算法

    非线性最小二乘问题例题_非线性自适应控制算法摘录的一篇有关求解非线性最小二乘问题的算法–LM算法的文章,当中也加入了一些我个人在求解高精度最小二乘问题时候的一些感触:LM算法,全称为Levenberg-Marquard算法,它可用于解决非线性最小二乘问题,多用于曲线拟合等场合。LM算法的实现并不算难,它的关键是用模型函数 f 对待估参数向量p在其邻域内做线性近似,忽略掉二阶以上的导数项,从而转化为线性最小二乘问题,它具有收敛速度快

    2022年9月26日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号