容器_JDK源碼分析_自己簡單實現ArrayList容器
這幾天仔細研究下關於ArrayList容器的jdk源碼,感覺收獲頗多,以前自己只知道用它,但它裏面具體是怎樣實現的就完全不清楚了。於是自己嘗試模擬寫下java的ArrayList容器,簡單了實現的ArrayList類中幾個方法,當然這僅僅只是加深對容器的理解,因此希望我的分享也能夠給大家帶來幫助。
一、AyyayList到底是什麽?
其實ArrayList就是一個java中的一個類而已,說起來沒什麽復雜的,好,既然是類,是不是就有成員屬性和成員方法。點擊查看ArrayList的outline,來看看他有哪些屬性和方法。
註意看下我著重標記的那一塊,是不是明白了什麽。其實ArrayList的底層實現是一個Object數組,也就是elementData數組,它用來存儲ArrayList添加的元素,這也就是為什麽ArrayList為什麽能夠存儲任何一切對象,因為它本身就是一個object數組。而size屬性只是用來保存存儲元素的個數,因為是私有的,所以只能通過size方法返回size的值,下面三個就是ArrayList的三個構造方法了。
二、自己簡單編碼實現ArrayList類
有了上面的知識鋪墊,現在可以開始編寫我們自己ArrayList類了。首先創建一個MyArrayList類,因為我現在只是簡單的實現ArrayList類,所以在MyArrayList類中就只有兩個核心的成員屬性,Object【】 elementData ;int size.在定義完屬性以後,然後編寫構造方法。
public class MyArrayList { //ArrayList的底層實現是根據數組實現,定義一個存儲元素的數組,類型為object,可以存取任意類型的元素 private Object[] elementData; //表示存儲元素的個數 private int size; //初始化elementData數組空間 public MyArrayList(int initialCapacity){ elementData = new Object[initialCapacity]; } //重載構造方法,默認存儲個數為3; public MyArrayList(){ this(3); } }
這裏我實現了兩個構造方法,構造方法主要是初始化elementData數組的大小,默認為3個,接下來在繼續實現add方法。
public void add(Object o){ //如果容器已滿,則進行擴容,擴容為以前的兩倍 if(size==elementData.length){ Object[] newArray =new Object[elementData.length*2]; System.arraycopy(elementData,0, newArray, 0,size); elementData = newArray; } elementData[size] = o; size++; }
這裏的話主要是有個需要擴容的地方,我這裏默認擴展為原來的兩倍,其實擴容的本質就是重新建立一個數組,開辟另外一片空間。相信大家看到這裏基本明白了剩下的方法怎麽寫了,這裏我就不細說了,我這裏就 附上自己寫的PS:我也只是簡單的寫了下,讀者有興趣可以自己研究,嘿嘿。
/* * 自己簡單的實現ArrayList容器 */ import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MyArrayList { //ArrayList的底層實現是根據數組實現,定義一個存儲元素的數組,類型為object,可以存取任意類型的元素 private Object[] elementData; //表示存儲元素的個數 private int size; //初始化elementData數組空間 public MyArrayList(int initialCapacity){ elementData = new Object[initialCapacity]; } //重載構造方法,默認存儲個數為10; public MyArrayList(){ this(3); } //添加元素的方法 public void add(Object o){ //如果容器已滿,則進行擴容,擴容為以前的兩倍 if(size==elementData.length){ Object[] newArray =new Object[elementData.length*2]; System.arraycopy(elementData,0, newArray, 0,size); elementData = newArray; } elementData[size] = o; size++; } //返回元素的個數 public int size(){ return size; } //通過索引獲取元素的值 public Object get(int i){ if(i<0||i>size-1){ return null; } return this.elementData[i]; } //判斷是否為空 public boolean empty(){ return size==0; } //把ArrayList轉換為數組 public Object[] toArray(){ return Arrays.copyOf(this.elementData,size); } public static void main(String[] args) { //創建myarraylist的一個容器對象 MyArrayList myarray = new MyArrayList(); //為容器對象添加元素 myarray.add("fsdf"); myarray.add("21343"); myarray.add("21343"); myarray.add("21343"); myarray.add("21343"); myarray.add("21343"); myarray.add("21343"); //遍歷輸出 for(int i=0;i<myarray.size();i++){ System.out.println(myarray.get(i)); } System.out.println(myarray.size()); Object[] o1 = myarray.toArray(); for(int i=0;i<o1.length;i++){ System.out.println(o1[i]); } } }
容器_JDK源碼分析_自己簡單實現ArrayList容器