一、比較三個List實現(xiàn)類
同:三個類都是實現(xiàn)了List接口,存儲數(shù)據(jù)的特點相同:存儲有序的、可重復的數(shù)據(jù)
異:
ArrayList:是用的最多得氓英,線程不安全所以效率高。底層使用Object[] elementData數(shù)組存儲
LinkedList:對于平凡的插入鹦筹、刪除操作效率更高,因為底層是雙向鏈表(ArrayList的話要一個個移址貌,但是查找多還是
ArrayList好)
Vector:1.0的時候出的古老實現(xiàn)類铐拐,其他包括List本身都是1.2出的;線程安全效率慢练对,其他和ArrayList差不多底層也是數(shù)組遍蟋。接班不用
二、ArrayList和Vector源碼分析
ArrayList:
jdk7.0的時候:
ArrayList list = new ArrayList();//底層創(chuàng)建了長度是10的數(shù)組
當添加的元素數(shù)量超過數(shù)組容量了就擴容螟凭,默認情況下擴容1.5倍虚青,并復制到新數(shù)組里。(和StringBuilder很像)
建議開發(fā)中使用帶參數(shù)的構造器:
new ArrayList(int capacity)
jdk8.0的時候:
new ArrayList();//底層初始化為{}螺男,第一次add時才創(chuàng)建長度為10的數(shù)組棒厘,其他一樣
好處:延遲數(shù)組的創(chuàng)建,節(jié)省內(nèi)存
Vector:
如果沒給capacity一開始也初始化長度為10的數(shù)組(類ArrayList7.0)下隧,但是擴容的時候擴為原來的2倍
三奢人、LinkedList源碼分析
Linked list = new LinkedList();//內(nèi)部聲明了Node類型的first和last屬性,默認值為null
list.add(“something”);//創(chuàng)建node并將數(shù)據(jù)裝到node里
其中Node定義為:
//是linkedlist的一個內(nèi)部類
private static class Node<E>{
E item淆院;//數(shù)據(jù)
Node<E> next;
Node<E> prev;
Node(Node<E> prev,Node<E> next,Node<E> next){
this.item = element;
this.next = next;
this,prev = prev
}
}
四何乎、List方法
List除了從Collection集合繼承的方法外,List 集合里添加了一些根據(jù)索引來操作集合元素的方法。
void add(int index, Object ele):在index位置插入ele元素
boolean addAll(int index, Collection eles):從index位置開始將eles中的所有元素添加進來
Object get(int index):獲取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出現(xiàn)的位置支救,找不到就-1
int lastIndexOf(Object obj):返回obj在當前集合中末次出現(xiàn)的位置抢野,找不到就-1
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set(int index, Object ele):設置指定index位置的元素為ele
List subList(int fromIndex, int toIndex):返回從fromIndex到toIndex位置的子集合
總結常用方法:
增:add(Object)
刪:remove(Object)/remove(index)
改:set(index,Object)
查:get(index)
插入:add(index,Object)
長度:size()
遍歷:
1.iterator
?2.for(Object o : list)
?3.for(int i =0;i<list.size();i++)