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 |
还没有评论,来说两句吧...