您的位置:首页 > 编程语言 > Java开发

java 1.7之后的Arraylist容量增长机制

2016-04-15 17:29 387 查看
一直以来都错误的理解Arraylist的容量自增长是添加一个元素容量自动加1,偶然的聊起这个话题,才发现貌似我理解错了,跑去看了Arraylist的源代码才清楚了它的容量自增长机制并不是我所认为的那样。下面是Arraylist容量增长的源代码,附上一些注释,如果有不正确的还希望大家能给纠正~~~

首先看一下ArrayList添加元素的方法:

public boolean add(E e) {
ensureCapacityInternal(size + 1);  // Increments modCount!!
elementData[size++] = e;
return true;
}


下面就是实现扩容的相关方法了:

private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}

ensureExplicitCapacity(minCapacity);
}

private void ensureExplicitCapacity(int minCapacity) {
modCount++;//定义于ArrayList的父类AbstractList,用于存储结构修改次数

// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//有些虚拟机会在数组内保留一些头部信息,尝试分配更大的容量可能会导致内存溢出
//容量扩容的精髓
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);
//将原来数组的值copy新数组中去, ArrayList的引用指向新数组(如果数据量很大还是建议初始化的时候指定容量的大小,提高效率)
elementData = Arrays.copyOf(elementData, newCapacity);
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: