ArrayList
ArrayList
是 Java
中基于数组实现的一个可变长度的动态数组,它实现了List
接口。位置:java.util.ArrayList
Java 8及之后的版本:
底层数据结构:
创建一个Object数组,默认为空数组(懒汉式)
1 2
| transient Object[] elementData; private int size;
|
构造方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
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); } }
|
- 默认构造函数用于扩容为默认大小10,只有第一次添加元素时才扩容。
- 带参的构造函数用于自己指定初始大小。
添加元素
1 2 3 4 5
| public boolean add(E e) { ensureCapacityInternal(size + 1); elementData[size++] = e; return true; }
|
size
表示添加元素之前已有的元素数量,size+1
即添加之后所需要的最小容量
ensureCapacityInternal
用于判断是否需要扩容,如果需要扩容,那么elementData
扩容为elementData = Arrays.copyOf(elementData, newCapacity);
,是原来的1.5倍,旧数组拷贝到新数组。
扩容操作的源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); }
private void ensureExplicitCapacity(int minCapacity) { modCount++; if (minCapacity - elementData.length > 0) grow(minCapacity); }
private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); }
|
删除元素
1 2 3 4 5 6 7 8 9 10
| public E remove(int index) { Objects.checkIndex(index, size); final Object[] es = elementData;
@SuppressWarnings("unchecked") E oldValue = (E) es[index]; fastRemove(es, index);
return oldValue; }
|
- E是泛型类型参数,用来表示
ArrayList
中存储的元素的类型。
ArrayList的查找和(尾部)添加元素效率高,删除和插入操作效率低。