1. 程式人生 > >容器_JDK源碼分析_自己簡單實現ArrayList容器

容器_JDK源碼分析_自己簡單實現ArrayList容器

cap 裏的 而已 編寫 add col ++ emp 為我

這幾天仔細研究下關於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容器