packagejava.util;importjava.util.function.Consumer;importjava.util.function.Predicate;importjava.util.function.UnaryOperator;importsun.misc.SharedSecrets;/**
* Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null. In addition to implementing the List interface, this class provides methods to manipulate the size of the array that is used internally to store the list. (This class is roughly equivalent to Vector, except that it is unsynchronized.)
* 翻译: ArrayList是一个动态数组,实现了List接口以及List相关的所有方法,它允许所有元素的插入,包括null.另外,ArrayList相较于Vector除了线程不同步之外,大致相等.
*/publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{//1.属性privatestaticfinallong serialVersionUID =8683452581122892189L;//默认容量的大小privatestaticfinalint DEFAULT_CAPACITY =10;//空数组常量privatestaticfinalObject[] EMPTY_ELEMENTDATA ={};//默认的空数组常量privatestaticfinalObject[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA ={};//存放元素的数组,从这可以发现ArrayList的底层实现就是一个Object数组transientObject[] elementData;//数组中包含的元素个数privateint size;//数组的最大上限privatestaticfinalint MAX_ARRAY_SIZE =Integer.MAX_VALUE -8;/* ArrayList的属性非常少,就只有上面这些,其中最重要的莫过于elementData了,ArrayList所有方法的操作都是建立在elementData之上. *///ArrayList内部的具体方法见下文分析.}
//remove方法与带指定下标的add方法非常类似,也是调用系统的arraycopy方法来移动元素,时间复杂度为O(n).publicEremove(int index){rangeCheck(index);
modCount++;//modCount是AbstractList抽象类的一个属性,表示List结构被修改的次数.E oldValue =elementData(index);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 workreturn oldValue;}
publicabstractclassAbstractList<E>extendsAbstractCollection<E>implementsList<E>{//The number of times this list has been structurally modified.//Structural modifications are those that change the size of the list, or otherwise perturb it in such a fashion that iterations in progress may yield incorrect results.protectedtransientint modCount =0;}
7. grow 方法
//grow方法是在数组进行扩容的时候用到的,ArrayList每次扩容都是扩1.5倍,然后调用Arrays类的copyOf方法,把元素重新拷贝到一个新的数组中去.privatevoidgrow(int minCapacity){// overflow-conscious codeint 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);}privatestaticinthugeCapacity(int minCapacity){if(minCapacity <0)// overflowthrownewOutOfMemoryError();return(minCapacity > MAX_ARRAY_SIZE)?Integer.MAX_VALUE : MAX_ARRAY_SIZE;}
//indexOf方法的作用是返回第一个等于给定元素的值的下标,它是通过遍历比较数组中每个元素的值来查找的,所以它的时间复杂度是O(n).publicintindexOf(Object o){if(o ==null){for(int i =0; i < size; i++)if(elementData[i]==null)return i;}else{for(int i =0; i < size; i++)if(o.equals(elementData[i]))return i;}return-1;}//lastIndexOf的原理跟indexOf一样,而它仅仅是从后往前找起罢了.publicintlastIndexOf(Object o){if(o ==null){for(int i = size-1; i >=0; i--)if(elementData[i]==null)return i;}else{for(int i = size-1; i >=0; i--)if(o.equals(elementData[i]))return i;}return-1;}