ArrayList 应该是大部分人接触JCF之后, 第一个熟悉和使用的类。它的特点主要有一下几个:
1. 基于数组
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); } }
2. 长度随意伸缩
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++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } 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); }
看过grow 方法了吧, 动态增加数组长度。
这里额外说下grow 方法里面的Arrays.copyOf(), 最终使用的是一个native的方法:
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
这算一个提升效率的一个点:在使用数组copy的使用可以使用Arrays.copyOf()代替其他方法。
3. 集合中可以放入任意类型的引用数据类型
因为ArrayList中的数组是Object数组,是所有对象的父类。额外说点,数组中存放的是对象的引用而不是对象本身。
4. 最后说点ArrayList中的fastRemove
/* * Private remove method that skips bounds checking and does not * return the value removed. */ private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work }
实现方式是不是和想象的不一样?