ArrayList特性
- 可以随机访问,按照索引位置进行访问效率很高,用算法描述中的术语,效率是O(1),简单说就是可以一步到位。
- 除非数组已排序,否则按照内容查找元素效率比较低,具体是O(N),N为数组内容长度,也就是说,性能与数组长度成正比。
- 添加元素的效率还可以,重新分配和拷贝数组的开销被平摊了,具体来说,添加N个元素的效率为O(N)。
插入和删除元素的效率比较低,因为需要移动元素,具体为O(N)。
实现接口
- Collection/List/RandomAccess/Cloneable/Serializable
内部主要组成部分
private transient Object[] elementData;//数组
private int size;//元素长度
数组长度扩展:1.5倍增长
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);
}
数组长度
最小长度10
最大长度Integer.MAX_ARRAY_SIZE
因为实现Iterable支持foreach遍历语法
有两个迭代方法
public Iterator<E> iterator();//向后
public ListIterator<E> listIterator();//向前
public ListIterator<E> listIterator(int index);//指定位置向前
常见错误用法
迭代过程中修改数组结构(remove、add、set)会抛出异常ConcurrentModificationException
删除可用迭代器中的删除,并且删除前调用next方法it.next();