JDK源码分析--ArrayList怎么扩容

为何将ArrayList的扩容单独写成一篇博客?

        之前对ArrayList进行过源码分析,对于扩容也有介绍,但考虑到文章写得有点多,可能一些朋友根本没兴趣全部看完;基于此原因,将其扩容规则单独列出。

源码:

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);//大约增加1.5倍
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    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);//将原数据复制到扩容后的数组中,赋值给elementData。
}

简述扩容规则:

        当添加元素后的需要的容量X大于原容量Y时进行扩容,首先将Y扩大约1.5倍(取整)得到Z,取X和Z中的最大值作为此次扩容的实际容量。

用一个表格来展示(请先弄懂有参和无参构造方法的区别,下面2行值是数组的容量):

元素个数(size)

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

new ArrayList()

0

10

10

10

10

10

10

10

10

10

10

15

15

15

15

15

22

new ArrayList(0)

0

1

2

3

4

6

6

9

9

9

13

13

13

13

19

19

19

看完表格内容,是不是对扩容规则已了如指掌了呢。如有疑问请联系博主,也可详细阅读博主之前写的一篇博客《JDK源码分析--ArrayList深入理解》

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值