为何将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> |
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/u010188178/article/details/87806738
内容来源于网络,如有侵权,请联系作者删除!