深入剖析ArrayList源代码
ArrayList这个容器实质上就是个会自动增长的数组,默认初始容量是10,按原容器的1.5倍扩容。在ArrayList里面定义了一个私有的数组。
/** * 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) {ensureCapacity(size + 1); // Increments modCount!!elementData[size++] = e;return true; }/** * Increases the capacity of this <tt>ArrayList</tt> instance, if * necessary, to ensure that it can hold at least the number of elements * specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ public void ensureCapacity(int minCapacity) {modCount++;int oldCapacity = elementData.length;if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity)newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity);} }?在往容器添加数据的方法中可以看到每添加一个元素都会调用一次ensureCapacity()方法,也就是添加容器长度的方法。但是传的参数是size+1,而size是容器包含的元素个数。所以每次添加的是包含元素个数+1的值。当然这里会有个判断,但元素个数+1超过原有数组长度的时候,就会执行扩容的动作。新数组的容量会是原数组的1.5倍。int newCapacity = (oldCapacity * 3)/2 + 1,接着会执行一个数组复制的动作。所以说到底ArrayList就是一个会自动增长长度的数组。从add()方法中也可以看出在ArrayList中可以增加重复的元素,并不会判断元素是否相等。