ArrayList、LinkedList、Vector的使用和優化。

ArrayList、LinkedList、Vector都實現了List接口,它們有什麼區別呢?

ArrayList低層是數組來實現的,所以它適合查找和修改,不適合刪除和增加。

LinkedList低層是雙向鏈表來實現的,所以它適合刪除和增加,不適合查找和修改。

Vector跟ArrayList相似,低層都是數組,它們唯一的區別就是vector是線程安全的,ArrayList是非線程安全的,所以Vector在使用起來,vector效率要底一些。爲什麼線程安全就效率底一些呢,因爲在設計這個容器的時候,爲了保證數據不能同時被兩個線程訪問,也就是爲了保護數據不出錯,所以訪問容器裏面的數據會有一個加鎖和釋放鎖的過程,Vector內部就是通過在方法體上加Synchronize關鍵字來到達這效果。這就導致了這個容器的存儲各方面效率相對較低,這也是經常使用ArrayList而很少Vector原因,跟們它們相似的還有HashMap和HashTable、StringBuffer和StringBuilder,因爲同樣的原因,HashMap和StringBuilder使用的比較多。

下面是一段模擬JDK中LinkedList的一個容器

class MyLinkedList<T>{
	
	int size=0;
	Node<T> first;//定義指向第一個節點的指針
	Node<T> last;//等譯指向最後一個節點的指針
	
	public void add(T data){
		final Node<T> l = last;//定義一個臨時的引用把最後一個節點保存起來
		final Node<T> newNode = new Node<T>(data, null);//新建節點
		last = newNode;
		if (l == null)//如果l爲空,說明之前還沒添加過節點
			first = newNode;//爲初始節點賦值
		else	//如果l不爲空,則說明之前已經添加過節點了,
			l.next = newNode;//
		size++;
	}
	
	public T get(int index){
		Node<T> n=this.first;//定義一個臨時的引用保存第一個節點
		for(int k=1;k<=index;k++,n=n.next);
		return n.data;	
	}
	
}

class Node<T>{
	T data;
	Node next;
	public Node(T data,Node<T> next){
		this.data=data;
		this.next=next;
	}
}
只模擬了添加和查找函數,對於修改和刪除思想應該差不多,這裏的add函數,剛開始,我沒寫出來,因爲感覺裏面都是各種引用,指過來指過去最後把數據都指沒了,後來參考jdk的源碼,才搞明白,下面是我對add函數的理解以及圖示:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章