ArrayList、LinkedList、Vector之間的區別
阿新 • • 發佈:2018-12-29
①ArrayList:內部採用陣列儲存元素,支援高效隨機訪問,支援動態調整大小;更適合遍歷查詢,增刪改查的效率相對低;
②LinkedList:內部採用連結串列來儲存元素,支援快速插入/刪除元素,但不支援高效地隨機訪問;更適合增刪改,遍歷效率相對低[無同步];
③Vector:採用陣列儲存元素,使用了synchronized方法,是一個執行緒安全的容器,所以效能上比ArrayList差[同步];
ArrayList | LinkedList | Vector | |
預設初始容量 | 10 | 10 | |
擴容機制 | 之前的1.5倍 | 之前的2倍 | |
底層儲存方式 | 陣列 | 雙向連結串列 | 陣列 |
執行緒 | 不安全 | 不安全 | 安全[synchronized方法] |
特點 | 查詢快,增刪慢 | 查詢慢,增刪改快 |
Collection介面是最基本的集合介面,一個Collection代表一組Object,即Collection的元素(elements);
由Collection介面派生的兩個介面是List和Set;
延伸:
面試題:去除[1,100000]之間的偶數
public class testList { public static void main(String[] args) { //====================去除[1,100000]之間的偶數======================== arrayRemove(); arrayAdd(); linkedremove(); } //準備一個ArrayList private static ArrayList<Integer> preList() { ArrayList<Integer> arrayList = new ArrayList<Integer>(100001); for (int i = 1; i < 100001; i++) { arrayList.add(i); } return arrayList; } //①ArrayList+迭代器+if+remove public static void arrayRemove() { ArrayList<Integer> arrayList = preList(); Long start = System.currentTimeMillis(); Iterator<Integer> iterator = arrayList.iterator(); while (iterator.hasNext()) { Integer next = iterator.next(); if (next % 2 == 0) { iterator.remove(); } } Long end = System.currentTimeMillis(); System.out.println("普通刪除消耗時間:" + (end - start)); } //②ArrayList*2+迭代器+if+add public static void arrayAdd() { ArrayList<Integer> arrayList1=new ArrayList<Integer>(); List<Integer> arrayList=preList(); Long start=System.currentTimeMillis(); Iterator<Integer> iterator=arrayList.iterator(); while(iterator.hasNext()){ Integer i=iterator.next(); if(i%2!=0){ arrayList1.add(new Integer(i)); } } Long end=System.currentTimeMillis(); System.out.println("第二種方法時間"+(end-start)); } public static void linkedremove(){ LinkedList<Integer> linkedList=new LinkedList<Integer>(); for(int i=1;i<100001;i++){ linkedList.add(new Integer(i)); } Long start=System.currentTimeMillis(); Iterator<Integer> iterator=linkedList.iterator(); while(iterator.hasNext()){ Integer i=iterator.next(); if(i%2==0){ iterator.remove(); } } Long end=System.currentTimeMillis(); System.out.println("linked刪除消耗時間"+(end-start)); } }
普通刪除消耗時間:830
第二種方法時間:32
linked刪除消耗時間:16
檢索、插入、刪除物件的效率:
ArrayList和Vector中,從指定的位置(用index)檢索一個物件,或在集合的末尾插入、刪除一個物件的時間是一樣的,可表示為O(1)。但是,如果在集合的其他位置增加或移除元素那麼花費的時間會呈線形增長:O(n-i),其中n代表集合中元素的個數,i代表元素增加或移除元素的索引位置。為什麼會這樣呢?以為在進行上述操作的時候集合中第i和第i個元素之後的所有元素都要執行(n-i)個物件的位移操作。
LinkedList中,在插入、刪除集合中任何位置的元素所花費的時間都是一樣的—O(1),但它在索引一個元素的時候比較慢,為O(i),其中i是索引的位置。所以,如果只是查詢特定位置的元素或只在集合的末端增加、移除元素,那麼使用Vector或ArrayList都可以。如果是對其它指定位置的插入、刪除操作,最好選擇LinkedList。