一、ArrayList详解
1.继承关系
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
2.属性
//默认的数组长度 private static final int DEFAULT_CAPACITY = 10; //存储list中元素的数组,transient关键字表示该对象在ArrayList序列化时不被序列化。 transient Object[] elementData; //数组中实际元素的个数 private int size; //数组的最大长度 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
3.构造方法:
ArrayList的构造函数总共有三个:
(1)ArrayList()构造一个初始容量为 10 的空列表。
(2)ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
(3)ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。
所以如果调用List list = new ArrayList(10);会直接调用第三个构造函数。否则就需要扩容。
4.其他重要方法
1)add()添加元素:
1 public boolean add(E e) { 2 ensureCapacityInternal(size + 1); // size为element数组的实际大小,若size+1<elementData.length,则不用动态扩容,否则需要将elementData进行动态扩容。 3 elementData[size++] = e; 4 return true; 5 } 6 private void ensureCapacityInternal(int minCapacity) { 7 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { 8 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); 9 } 10 11 ensureExplicitCapacity(minCapacity); 12 } 13 14 private void ensureExplicitCapacity(int minCapacity) { 15 modCount++; 16 17 if (minCapacity - elementData.length > 0) 18 grow(minCapacity); 19 } 20 //grow:elementData数组扩容 21 private void grow(int minCapacity) { 22 int oldCapacity = elementData.length; 23 //每次增长newCapacity=oldCapacity*1.5,为原来的1.5倍 24 int newCapacity = oldCapacity + (oldCapacity >> 1); 25 //如果oldCapacity*1.5倍后,容量还是比minCapacity要小,则将newCapacity的值直接置为minCapacity 26 if (newCapacity - minCapacity < 0) 27 newCapacity = minCapacity; 28 //如果增长的新长度大于了MAX_ARRAY_SIZE,则调用hugeCapacity来获取一个不大于Integer.MAX_VALUE的值。 29 if (newCapacity - MAX_ARRAY_SIZE > 0) 30 newCapacity = hugeCapacity(minCapacity); 31 //重新申请一个newCapacity长度的数组空间,并把elementData数组中内容拷贝过去。 32 elementData = Arrays.copyOf(elementData, newCapacity); 33 } 34 //hugeCapacity: elementData的最大容量 35 private static int hugeCapacity(int minCapacity) { 36 if (minCapacity < 0) // overflow 37 throw new OutOfMemoryError(); 38 //当最小保证的容量minCapacity比MAX_ARRAY_SIZE还大时,返回Integer.MAX_VALUE;否则直接返回MAX_ARRAY_SIZE 39 return (minCapacity > MAX_ARRAY_SIZE) ? 40 Integer.MAX_VALUE : 41 MAX_ARRAY_SIZE; 42 }