ArrayList 是 Collection 的派生类, 数据存储结构为 Object[] 数组,
transient Object[] elementData;
日常使用中, 当我们创建一个无参的 ArrayList 对象时, 这也是我们日常使用比较多的构造函数,
- /**
- * Constructs an empty list with an initial capacity of ten.
- */
- public ArrayList() {
- this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
- }
其全局属性 elementData 存放元素的数组会被赋值一个空数组,
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
当我们调用 ArrayList 的 add 方法时, 就会涉及到扩容机制了, 首次添加元素时, 因为存放元素的数组为空数组, 会先设置一个长度为 10 的数组长度对空数组扩容, 调用
Arrays.copyOf(elementData, newCapacity); //newCapacity=10
进行扩容.
当添加的元素超过 10 个时, 首先会扩容至长度 15, 以此类推, 每次扩容至原长度的右移 1 位的长度, 即 15+15>>1 =22,22+22>>1 = 33...
最大能扩容的长度为 Integer.MAX_VALUE=2 的 31 次方 - 1, 即 2147483647
- // 首次超过原数组长度, minCapacity = 11
- private void grow(int minCapacity) {
- // 原数组长度为 10
- int oldCapacity = elementData.length;
- // 新长度设置为原数组长度的 1.5 倍, 即 15
- int newCapacity = oldCapacity + (oldCapacity>> 1);
- // 保证新扩展长度能保证存入新数据
- if (newCapacity - minCapacity <0)
- newCapacity = minCapacity;
- // 保证新长度不超过最大能分配长度, 防止发生 OOM
- 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);
- }
来源: http://www.bubuko.com/infodetail-3653627.html