您的位置:首页 > 其它

Arraylist源码分析

2017-06-30 20:14 363 查看
1.ArrayList是基于数组实现的。由此会产生一些问题,数组大小是固定的,Arraylist是支持动态增加的,那又是如何做到的。今天看了下源码,和大家分享下。

2.

public boolean add(E e) {
//首先是这个函数
ensureCapacityInternal(size + 1);  // Increments modCount!!
elementData[size++] = e;
return true;
}

private void ensureCapacityInternal(int minCapacity) {
//第一次增加元素会执行下面的代码,minCapacity=10
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
//紧接着执行这个函数
ensureExplicitCapacity(minCapacity);
}

private void ensureExplicitCapacity(int minCapacity) {
modCount++;
//第一次增加元素会执行grow(minCapacity)函数,当minCapacity=11时,此时elementData.length=10,此时数组已经满了,应该进行扩容,
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//扩容函数
private void grow(int minCapacity) {
// overflow-conscious code
System.out.println("开始扩容");
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);   //每次扩容是以前的二倍
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就变成了容量为10个元素的数组,如果接下来插入的数据不到十个就不会扩容,扩容的话,就是复制原来的数组,给定新的容量。
elementData = Arrays.copyOf(elementData, newCapacity);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息