java lsit扩容_Java面试必备:从源码角度看 ArrayList扩容机制

良多Java步伐员正在口试中城市碰着一些槛,让患上良多人比力尴尬。特别是一些近似于数据机制类的工具,有良多人底子没有懂。本日,笔者就来分享下ArrayList的扩容机制。

gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

​起首从 ArrayList 的机关函数提及:ArrayList有三种体式格局来初始化,机关办法源码以下:

因为篇幅缘故原由,笔者放的是代码的截图。可是看看这段代码,仔细的同窗大概曾经发明了 ,用无参数机关办法创立 ArrayList 的时辰,初始化赋值的其实是个空数组。当为这个数组增加元素的时辰,才入手下手分派容量。即向数组中增加第一个元素时,数组容量扩为10。 上面正在咱们阐发 ArrayList 扩容时会降到这一点内容!以这个为例子阐发,起首看看add办法:

再来看看 ensureCapacityInternal()办法以及ensureCapacity()办法:

能够看到,add办法起首挪用了ensureCapacityInternal(size + 1),当 要 add 进第1个元素时,minCapacity为1,正在Math.max()办法比力后,minCapacity 为10。当咱们要 add 进第1个元素到 ArrayList 时,elementData.length 为0 (由于仍是一个空的 list),由于履行了 ensureCapacityInternal()办法 ,以是 minCapacity 此时为10。此时minCapacity – elementData.length > 0建立,以是会进入 grow(minCapacity)办法。

当add第2个元素时,minCapacity 为2,此时e lementData.length(容量)正在增加第一个元素后扩容成 10 了。此时,minCapacity – elementData.length > 0不可立,以是没有会进入 (履行)grow(minCapacity)办法。增加第三、4···到第10个元素时,仍然没有会履行grow办法,数组容量都为10。直到增加第11个元素,minCapacity(为11)比elementData.length(为10)要年夜。进入grow办法举行扩容。

再看看grow办法

int newCapacity = oldCapacity + (oldCapacity >> 1),以是 ArrayList 每一次扩容以后容量城市变成本来的 1.5 倍! 再来看看hugeCapacity()办法。

​从下面 grow()办法源码咱们晓得: 假如新容量年夜于 MAX_ARRAY_SIZE,进入(履行) hugeCapacity()办法来比力 minCapacity 以及 MAX_ARRAY_SI微视拍客ZE,假如minCapacity年夜于最年夜容量,则新容量则为Integer.MAX_VALUE,不然,新容量巨细则为 MAX_ARRAY_SIZE 即为 Integer.MAX_VALUE – 8。ArrayList 源码中有一个 ensureCapacity办法没有晓得大师留意到不,这个办法 ArrayList 外部不被挪用过,以是很明显是供给给用户挪用的,那末这个办法有甚么感化呢?

能够看到,最佳正在 add 大批元素以前用 ensureCapacity办法,以淘汰增量重新分派的次数。而经由过程以下代码便可到达利用后果。

运转成果:利用ensureCapacity办法前:4637,利用ensureCapacity办法前:241。经由过程运转成果,咱们能够很分明的看出向 ArrayList 增加大批元素以前最佳先利用ensureCapacity办法,以淘汰增量重新分派的次数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值