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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • case when 判断_sqlservercase用法

    case when 判断_sqlservercase用法casewhen简单用法—改变结果SELECTCASE id WHEN21THEN ‘aaaaa’ WHEN22THEN ‘bbbbb’ELSE’其他’ END FROM hrmresource WHERE id=23casewhen复杂用法—执行不同的sqlSELECT ( CASE WHENa.id=21THEN (SELECTidFROMhrmresourceWHEREidIN(21

    2022年9月5日
    4
  • net/sf/json/jsonobject_js获取json对象的值

    net/sf/json/jsonobject_js获取json对象的值最后一行需要保留,有两个jdk版本的实现:json-lib-2.1-jdk13.jar和json-lib-2.1-jdk15.jar&lt;dependency&gt;&lt;groupId&gt;net.sf.json-lib&lt;/groupId&gt;&lt;artifactId&gt;json-lib&lt;/art…

    2022年9月22日
    1
  • JavaScript中的数组方法总结+详解「建议收藏」

    JavaScript中的数组方法总结+详解「建议收藏」在JS中,数组方法是非常重要且常用的的方法.在此整理总结一番.JavaScript数组的力量隐藏在数组方法中。1.js常用数组方法方法名功能返回值是否改变原数组版本push()在数组最后一位添加一或多个元素返回长度YES5-unshift()在数组前添加一或多个元素返回长度YES5-2.方法详解1.push……

    2022年7月13日
    12
  • 二级Python选择题_二级python选择题题库

    二级Python选择题_二级python选择题题库上半部分–>请点击https://blog.csdn.net/ExclusiveName/article/details/104537575第七套真题在面向对象方法中,一个对象请求另一对象为其服务的方式是通过发送___________。A命令B口令C消息D调用语句正确答案:C下面不属于软件需求分析阶段主要工作的是___________。A需…

    2022年8月31日
    0
  • TD SCDMA_DWAD4和TD4的区别

    TD SCDMA_DWAD4和TD4的区别CDMA,GSM,WCDMA,TD-SCDMA,CDMA2000,3G的区别

    2022年9月1日
    2
  • C#递归算法总结_c++递归算法

    C#递归算法总结_c++递归算法递归数组是啥?1,1,2,3,5,8,13,21,……当这样一组数字出现在你面前,如果接触的少,或者像我这样学过就忘了的人,一下还真反应不过来它的规律,实际上就是F(n)=F(n-1)+F(n-2);然后面试会遇到这么一个题,要求写一个函数(方法),只输入一个参数intindex,要求输出数组内下标为index与其之前的数之和。publicintarr(intindex){if(index==1||index==2){return1;

    2022年10月23日
    0

发表回复

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

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