本文主要講Collection接口之一List接口及其實現類。
List集合,特點:有序,可重複
與上文中Set不同的是,List集合是有序的,這種順序表現在:通過索引的形式,記錄了元素的添加順序。
List接口的實現類,如圖所示:
1. ArrayList 與數組有關嗎?
2.Vector
3.LinkedList
上文研究Set集合的時候,瞭解到LinkedHashSet是通過鏈表的形式將hash算法存儲的元素鏈接起來,這裏是不是將:帶有索引的List集合也通過鏈表的形式,連接起來呢?
從圖中看出,實現了deque接口,猜測應該會實現雙向隊列的效果把。
待我慢慢道來.......
一、List接口和ListIterator接口
List接口的特點在於通過“索引”記錄了元素的添加順序。因此相比較起父接口Collection而言,添加了一些根據索引操作集合元素的方法。
額外添加了專門操作List的方法:listIterator()
listIterator與Iterator對比:listIterator增加了向前迭代的功能(Iterator只能向後迭代),增加了通過add方法向List集合中添加元素(Iterator只能刪除元素)
public class TestlistIterator {
public static void main(String[] args) {
String[] books = {"englishbook","computerbook","musicbook"};
List bookList = new ArrayList();
for (int i = 0; i < books.length; i++) {
bookList.add(books[i]);
}
ListIterator bookListIterator = bookList.listIterator();
while(bookListIterator.hasNext()){
System.out.println("book正向迭代:"+bookListIterator.next());
bookListIterator.add("---------分隔符--------------");
}
System.out.println("-------下面開始反向迭代----------------");
while(bookListIterator.hasPrevious()){
System.out.println("book反向迭代:"+bookListIterator.previous());
}
}
}
結果如下:
二、ArrayList和Vector實現類
1. 相同點:
都是基於數組實現的List類,所以封裝了一個動態再分配的Object[]數組。通過屬性capacity表示長度,且會自動增長。
若添加大量元素,可使用ensureCapacity一次性添加capacity。甚至是直接指定capacity的大小,從而減少重新分配的次數,提高性能。
2. 不同點:
簡單理解爲新的ArrayList替代舊的Vector的功能。
ArrayList是線程不安全,Vector線程安全(性能較高,但不建議使用)
Stack是Vector的子類,模擬“棧”數據結構,LIFO。
LinkedList基於鏈表實現List類,優化順序訪問,特別是:插入、刪除,速度非常快。(同時實現Deque接口,雙向隊列)
三、固定長度的List
操作數據的工具類Arrays.asList(.....)將數組轉化爲List集合【此時爲Arrays內部類ArrayList的實例】
注意:此時長度已經固定了!不可改變
四、性能排名榜
各容器性能對比,主要取決於集合的底層實現,是:數組/鏈表
插入、刪除、迭代時:數組 < 鏈表。
隨機訪問:數組 > 鏈表。(數組,連續內存區)