浅谈ArrayList(一)中简单介绍了ArrayList的一些使用方法,首先看一段代码
ArrayList arrayList=new ArrayList(10);
for(int i=0;i<20;i++)
{
arrayList.add(i);
}
在此处new了一个ArrayList,容量为10,但是添加了20个数据,依然可以存入其中,这时我们就得查看一下add方法
主要关注的源码如下
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
这个add方法的是将指定的元素追加的列表的末尾,方法内代码简单,就三句,第一句的意思稍微思考一下就知道就是对容量的处理,如果没有数据,size则为0,当add时,加1进行容量扩展。第二句便是正常的将参数追加到列表末尾去,然后返回true。
查看ensureCapacityInternal源码:
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
其中elementData是元素实际存储数组,DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个默认的空数组,传入的参数minCapacity是指所需的最小容量,add方法中传入的是一个size+1的参数,一开始则传入1,之后依次增加;if语句对空进行判断,为空则使用Math.max方法进行扩容,主要关注代码为最后一句,查看ensureExplicitCapacity方法源码:
private void ensureExplicitCapacity(int minCapacity) {
modCount++;//来自抽象类,不能持久化
// overflow-conscious code
if (minCapacity - elementData.length > 0)//如果传入的容量大于实际数据存储长度,则调用grow方法
grow(minCapacity);
}
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//新容量加一半(如oldCapacity为10,newCapacity则为15)
if (newCapacity - minCapacity < 0)//比较
newCapacity = minCapacity;//新创建容量大则使用最小容量,即传入的容量值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);//复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度
}
此时便实现了add添加,这只是实现向列表末尾添加数据,还有指定位置插入数据。以后再慢慢道来!