ArrayList扩容

Posted 小明在努力

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList扩容相关的知识,希望对你有一定的参考价值。

ArrayList是Array的扩展版,具有自动增长的特性,可以理解为动态数组.

其内部的实现关键是:用以存储任何对象的Object[] elementData, 并在增加元素的时候,检测目前数组的大小是否足以容纳新元素,不足则扩容-复制-添加,其扩容算法如下:

JDK1.6

 1 // JDK6的扩容机制
 2 public void ensureCapacity(int minCapacity) {  
 3 modCount++;  
 4 int oldCapacity = elementData.length;  
 5 if (minCapacity > oldCapacity) {  
 6     Object oldData[] = elementData;  
 7     int newCapacity = (oldCapacity * 3)/2 + 1;  
 8         if (newCapacity < minCapacity)  
 9             newCapacity = minCapacity;  
10   // minCapacity is usually close to size, so this is a win:  
11   elementData = Arrays.copyOf(elementData, newCapacity);  
12 }  
13 }

JDK1.7+

 1 private void grow(int minCapacity) {
 2         // overflow-conscious code
 3         int oldCapacity = elementData.length;
 4         int newCapacity = oldCapacity + (oldCapacity >> 1);
 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);
11     }

 

在查资料时,发现各个博客对于增长的速率书写于我查看源码的速率不对,便猜想可能跟JDK版本有关。

也说明,写软件的软件要以当前JDK的源码为准,所以说查源码还是很有用的。

以上是关于ArrayList扩容的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList的底层数组扩容你会吗?

你知道的Go切片扩容机制可能是错的

ArrayList与LinkedList的扩容

Java 集合学习笔记:ArrayList

Java 集合深入理解 :ArrayList源码解析,及动态扩容机制

ArrayList扩容源码详细解读(JDK1.8)