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

x33g5p2x  于2021-12-18 转载在 其他  
字(1.9k)|赞(0)|评价(0)|浏览(266)

为何将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行值是数组的容量):

<br>元素个数(size)<br><br>0<br><br>1<br><br>2<br><br>3<br><br>4<br><br>5<br><br>6<br><br>7<br><br>8<br><br>9<br><br>10<br><br>11<br><br>12<br><br>13<br><br>14<br><br>15<br><br>16<br>
<br>new ArrayList()<br><br>0<br><br>10<br><br>10<br><br>10<br><br>10<br><br>10<br><br>10<br><br>10<br><br>10<br><br>10<br><br>10<br><br>15<br><br>15<br><br>15<br><br>15<br><br>15<br><br>22<br>
<br>new ArrayList(0)<br><br>0<br><br>1<br><br>2<br><br>3<br><br>4<br><br>6<br><br>6<br><br>9<br><br>9<br><br>9<br><br>13<br><br>13<br><br>13<br><br>13<br><br>19<br><br>19<br><br>19<br>

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

相关文章