本文結構:
1.介紹特色
2.基本方法
3.重點源碼分析java
ArrayList:
是List的一個具體實現子類,是List接口的一個數組實現 (裏面一定維護了一個數組)。
默認初始容量10, 擴容機制1.5倍。(數組必然有初始容量和擴容機制)
有序。
容許null元素。
容許重複元素。
線程不安全。數組
關鍵字 | 簡介 |
---|---|
add |
增長 |
contains |
判斷是否存在 |
get |
獲取指定位置的對象 |
indexOf |
獲取對象所處的位置 |
remove |
刪除 |
set |
替換 |
size |
獲取大小 |
toArray |
轉換爲數組 |
addAll |
把另外一個容器全部對象都加進來 |
clear |
清空 |
源碼解析:安全
public class MyArrayList<E>{ private static final int DEFAULT_CAPACITY = 10;// 默認容量 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;// 最大容量 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA ={} ;//空數組 private Object[] elements;//底層維護的數組 private int size;//容器內對象的個數 private int modCount;//記錄ArrayList這個對象被修改的次數 //構造方法 public MyArrayList(Object[] elements) { this.elements = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } /** *增長內容 * @param e * @return */ public boolean add(E e) { //若是未建立則建立一個默認爲10的數組,若小則擴容 int minCapacity=size+1; //查看容量是否夠(不夠則擴容),或者數組是否還未建立 ensureCapacityInternal(minCapacity); //確保容量夠,則添加數據,並將數據大小加1. elements[size]=e; size++; return true; } //該方法來確保數組的容量夠用,若還未建立數組則建立數組並賦予默認值。 private void ensureCapacityInternal(int minCapacity) { //若數組爲空(還未添加數據) if (elements==DEFAULTCAPACITY_EMPTY_ELEMENTDATA){ //則選出默認值和最小容量的最大值 minCapacity=Math.max(DEFAULT_CAPACITY,minCapacity); //只add方法其實不必比較,主要是addAll()這個方法須要比較 } modCount++;//修改次數加一 //判斷一下是否須要擴容,若數據+1大於當前數組,則須要擴容 if(minCapacity-elements.length>0){ grow(minCapacity);//調用擴容方法 } } //擴容具體方法 private void grow(int minCapacity){ int oldCapacity=elements.length;//獲取原始數組的長度 int newCapacity=oldCapacity+(oldCapacity>>1);//擴容 1+0.5 倍 //若擴容後的長度比所須要的最低長度還要小,則直接把擴容的長度更改成最低所需長度 if (newCapacity-minCapacity<0){ newCapacity=minCapacity; } //若擴容完的新長度比規定的最大容量還大,則要進一步判斷,並進一步修改數組大小 if (newCapacity-MAX_ARRAY_SIZE>0){ //若所需的容量居然小於0,說明超過Int最大值,越界了,拋出異常 if (minCapacity<0){ throw new OutOfMemoryError(); } //若所需的容量不超過Int最大值,則再判斷 if (minCapacity>MAX_ARRAY_SIZE){//若所需的大於數組要求的而小於Int最大值 newCapacity=Integer.MAX_VALUE;//直接賦值Int最大值 }else{//不然只有小於數組最大值這一種狀況了,賦予數組最大值便可 newCapacity=MAX_ARRAY_SIZE; } } } }