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


相关推荐

  • pycharm 搜索快捷键_word替换文字快捷键

    pycharm 搜索快捷键_word替换文字快捷键PyCharm快捷键——搜索/替换快捷键搜索/替换快捷键序号快捷键作用1CTRL+F查找2F3查找下一个3SHIFT+F3查找上一个4CTRL+R替换5CTRL+SHIFT+F指定路径下查找6CTRL+SHIFT+R指定路径下替换

    2022年8月25日
    4
  • nginx https 开发 DAT/UAT环境配置

    nginx https 开发 DAT/UAT环境配置server{listen443;server_namedev-mosale.gblfy.com.cn;sslon;#root/home/klapp;indexindex.htmlindex.htm;ssl_certificate/home/lklapp/gblfy.com.cn_bundle.crt;ssl_certificate_key/home/lklapp/gblfy.com.cn.key;s

    2022年9月30日
    7
  • JS中鼠标拖拽div(2)(setCapture()方法和releaseCapture()方法)

    JS中鼠标拖拽div(2)(setCapture()方法和releaseCapture()方法)接着鼠标拖拽div(1)解决问题,当在拖拽事件所在的页面按下键盘的ctrl+A全选后,再去拖拽div,浏览器会默认去搜索网页中的内容,拖拽功能就会失效,(搜索网页内容是浏览器的默认行为,所以要想不发生这种情况,就得将其取消,是谁执行之后触发了浏览器的默认行为,就在谁里面returnfalse即可取消浏览器的默认行为,但这种方式ie8及以下的版本不支持。)在ie8及以下版本浏览器中,如果调用了元素的setCapture()方法,那么点击任何事物都会来执行这个元素绑定的响应函数。例如:btn.oncl

    2022年5月8日
    53
  • 按位取反怎么运算_按位取反运算

    按位取反怎么运算_按位取反运算读本文前请首先搞懂“反码”,“取反”,“按位取反(~)”,这3个概念是不一样的。取反:0变1,1变0反码:正数的反码是其本身,对于负数其符号位不变其它各位取反(0变1,1变0)按位取反(~):这将是下面要讨论的。“~”运算符在c、c++、java、c#中都有,之前一直没有遇到这个运算符。要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二

    2022年4月19日
    115
  • angular基础面试题_java web面试题

    angular基础面试题_java web面试题angular用管道转换数据Angular为典型的数据转换提供了内置的管道,包括国际化的转换(i18n),它使用本地化信息来格式化数据。数据格式化常用的内置管道如下: DatePipe:根据本地环境中的规则格式化日期值。 DatePipe:Formatsadatevalueaccordingtolocalerules. UpperCasePipe:把文本全部转换成大写。 LowerCasePipe:把文本全部转换成小写。 LowerCasePipe:.

    2022年10月18日
    3
  • 使用block实现两个页面之间的传统价值观

    使用block实现两个页面之间的传统价值观

    2022年1月6日
    58

发表回复

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

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