jdk文档中关于ArrayList的描述http://docs.oracle.com/javase/7/docs/api/
从jdk文档中可以看出,ArrayList继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。下面来看看具体的实现方法。
在ArrayList类中除了定义了私有的静态变量,提供了两个成员变量。elementData存储ArrayList内的元素,size表示它包含的元素的数量。
transient Object[] elementData; // non-private to simplify nested class access
private int size;ArrayList提供了三种构造方法,
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
第一个构造方法使用提供的initialCapacity来初始化elementData数组的大小。第二个构造方法调用第一个构造方法并传入参数10,即默认elementData数组的大小为10。第三个构造方法则将提供的集合转成数组返回给elementData(返回若不是Object[]将调用
Arrays.copyOf方法将其转为Object[])。
add(E e)方法的作用是在尾部添加一个元素。
/**
* Appends the specified element to the end of this list.
*
* @param e element to be appended to this list
* @return <tt>true</tt> (as specified by {@link Collection#add})
*/
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
其中ensureCapacityInternal()方法是确保在添加新元素之前数组下标不会越界。实现如下
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
先判断数组类容是否为空,如果为空capacity取默认capacity值为10与传入参数minCapacity中较大的值。如果不为空调用ensureExplicitCapacity方法确保下标不越界。
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
modCount为ArrayList结构变化的次数,如果传入的minCapacity比目前数组的长度大则要调用grow()方法对数组进行扩充。
/**
* 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);
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 = Arrays.copyOf(elementData, newCapacity);
}
newCapacity 即为扩充后的数组长度,获取方法为旧的数组长度加上旧的数组长度右移一位(二进制数右移)。再通过两个判断来验证新的数组长度是否过小或过大。然后用copyOf()方法复制原数组数据扩展长度来得到新的数组。最终将新的元素加入到新的数组。
ArrayList中定义了私有的内部类Itr来实现Iterator接口并实现Iterator接口中的方法。当调用ArrayList的iterator()方法时,就会初始化Itr类并返回该实例。
当然也可以通过for循环来遍历ArrayList。
该贴由koei123转至本版2015-2-6 4:50:45