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函數的理解以及圖示: