
1.所有集合類都位于java.util包下。Java的集合類主要由兩個(gè)接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,這兩個(gè)接口又包含了一些子接口或?qū)崿F(xiàn)類。
2. 集合接口:6個(gè)接口(短虛線表示),表示不同集合類型,是集合框架的基礎(chǔ)。
3. 抽象類:5個(gè)抽象類(長虛線表示),對集合接口的部分實(shí)現(xiàn)。可擴(kuò)展為自定義集合類。
4. 實(shí)現(xiàn)類:8個(gè)實(shí)現(xiàn)類(實(shí)線表示),對接口的具體實(shí)現(xiàn)。
5. Collection 接口是一組允許重復(fù)的對象。
6. Set 接口繼承 Collection,集合元素不重復(fù)。
7. List 接口繼承 Collection,允許重復(fù),維護(hù)元素插入順序。
8. Map接口是鍵-值對象,與Collection接口沒有什么關(guān)系。
9.Set、List和Map可以看做集合的三大類:
List集合是有序集合,集合中的元素可以重復(fù),訪問集合中的元素可以根據(jù)元素的索引來訪問。
Set集合是無序集合,集合中的元素不可以重復(fù),訪問集合中的元素只能根據(jù)元素本身來訪問(也是集合里元素不允許重復(fù)的原因)。
Map集合中保存Key-value對形式的元素,訪問時(shí)只能根據(jù)每項(xiàng)元素的key來訪問其value。
List是一個(gè)有序的隊(duì)列,每一個(gè)元素都有它的索引。第一個(gè)元素的索引值是0。List的實(shí)現(xiàn)類有LinkedList, ArrayList, Vector, Stack。
List接口
List集合代表一個(gè)有序集合,集合中每個(gè)元素都有其對應(yīng)的順序索引。List集合允許使用重復(fù)元素,可以通過索引來訪問指定位置的集合元素。
List接口繼承于Collection接口,它可以定義一個(gè)允許重復(fù)的有序集合。因?yàn)長ist中的元素是有序的,所以我們可以通過使用索引(元素在List中的位置,類似于數(shù)組下標(biāo))來訪問List中的元素,這類似于Java的數(shù)組。
List接口為Collection直接接口。List所代表的是有序的Collection,即它用某種特定的插入順序來維護(hù)元素順序。用戶可以對列表中每個(gè)元素的插入位置進(jìn)行精確地控制,同時(shí)可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素。實(shí)現(xiàn)List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
(1)ArrayList
ArrayList是一個(gè)動(dòng)態(tài)數(shù)組,也是我們最常用的集合。它允許任何符合規(guī)則的元素插入甚至包括null。每一個(gè)ArrayList都有一個(gè)初始容量(10),該容量代表了數(shù)組的大小。隨著容器中的元素不斷增加,容器的大小也會(huì)隨著增加。在每次向容器中增加元素的同時(shí)都會(huì)進(jìn)行容量檢查,當(dāng)快溢出時(shí),就會(huì)進(jìn)行擴(kuò)容操作。所以如果我們明確所插入元素的多少,最好指定一個(gè)初始容量值,避免過多的進(jìn)行擴(kuò)容操作而浪費(fèi)時(shí)間、效率。
????? size、isEmpty、get、set、iterator 和 listIterator 操作都以固定時(shí)間運(yùn)行。add 操作以分?jǐn)偟墓潭〞r(shí)間運(yùn)行,也就是說,添加 n 個(gè)元素需要 O(n) 時(shí)間(由于要考慮到擴(kuò)容,所以這不只是添加元素會(huì)帶來分?jǐn)偣潭〞r(shí)間開銷那樣簡單)。
?ArrayList擅長于隨機(jī)訪問,同時(shí)ArrayList是非同步的。
時(shí)間開銷主要來源于數(shù)組復(fù)制
(2)LinkedList
同樣實(shí)現(xiàn)List接口的LinkedList與ArrayList不同,ArrayList是一個(gè)動(dòng)態(tài)數(shù)組,而LinkedList是一個(gè)雙向鏈表。所以它除了有ArrayList的基本操作方法外還額外提供了get,remove,insert方法在LinkedList的首部或尾部。
由于實(shí)現(xiàn)的方式不同,LinkedList不能隨機(jī)訪問,它所有的操作都是要按照雙重鏈表的需要執(zhí)行。在列表中索引的操作將從開頭或結(jié)尾遍歷列表(從靠近指定索引的一端)。這樣做的好處就是可以通過較低的代價(jià)在List中進(jìn)行插入和刪除操作。
與ArrayList一樣,LinkedList也是非同步的。如果多個(gè)線程同時(shí)訪問一個(gè)List,則必須自己實(shí)現(xiàn)訪問同步。一種解決方法是在創(chuàng)建List時(shí)構(gòu)造一個(gè)同步的List:?
List list = Collections.synchronizedList(new LinkedList(...));
時(shí)間開銷主要來源于遍歷元素
(3)Vector
與ArrayList相似,但是Vector是同步的。所以說Vector是線程安全的動(dòng)態(tài)數(shù)組。它的操作與ArrayList幾乎一樣。
(4)Stack
???? Stack繼承自Vector,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧。Stack提供5個(gè)額外的方法使得Vector得以被當(dāng)作堆棧使用?;镜膒ush和pop 方法,還有peek方法得到棧頂?shù)脑?/b>,empty方法測試堆棧是否為空,search方法檢測一個(gè)元素在堆棧中的位置。Stack剛創(chuàng)建后是空棧。
最重要的是:List集合是有序集合,集合中的元素可以重復(fù),訪問集合中的元素可以根據(jù)元素的索引來訪問。