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

野性酷女 2022-03-18 10:47 424阅读 0赞

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

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

源码:

  1. private void grow(int minCapacity) {
  2. // overflow-conscious code
  3. int oldCapacity = elementData.length;
  4. int newCapacity = oldCapacity + (oldCapacity >> 1);//大约增加1.5倍
  5. if (newCapacity - minCapacity < 0)
  6. newCapacity = minCapacity;
  7. if (newCapacity - MAX_ARRAY_SIZE > 0)
  8. newCapacity = hugeCapacity(minCapacity);
  9. // minCapacity is usually close to size, so this is a win:
  10. elementData = Arrays.copyOf(elementData, newCapacity);//将原数据复制到扩容后的数组中,赋值给elementData。
  11. }

简述扩容规则:

当添加元素后的需要的容量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深入理解》。

发表评论

表情:
评论列表 (有 0 条评论,424人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JDK分析-ArrayList

    继承结构 我们都知道数组定义了长度就不可以改变了,而List其实就是可延长的数组,内部就是采用数组结构来实现的,具体怎么实现的,我们往下来看源码,首先是ArrayList