一.集合的關(guān)系體系
關(guān)系:
上述類圖中算行,實線邊框的是實現(xiàn)類,比如ArrayList胆萧,LinkedList,HashMap等俐东,折線邊框的是抽象類,比如AbstractCollection订晌,AbstractList虏辫,AbstractMap等,而點線邊框的是接口锈拨,比如Collection砌庄,Iterator,List等奕枢。
1.Iterator接口
Iterator接口娄昆,這是一個用于遍歷集合中元素的接口,主要包含hashNext(),next(),remove()三種方法缝彬。它的一個子接口LinkedIterator在它的基礎(chǔ)上又添加了三種方法萌焰,分別是add(),previous(),hasPrevious()。也就是說如果是先Iterator接口谷浅,那么在遍歷集合中元素的時候扒俯,只能往后遍歷,被遍歷后的元素不會在遍歷到一疯,通常無序集合實現(xiàn)的都是這個接口撼玄,比如HashSet,HashMap墩邀;而那些元素有序的集合掌猛,實現(xiàn)的一般都是LinkedIterator接口,實現(xiàn)這個接口的集合可以雙向遍歷眉睹,既可以通過next()訪問下一個元素荔茬,又可以通過previous()訪問前一個元素废膘,比如ArrayList。
抽象類的使用兔院。如果要自己實現(xiàn)一個集合類殖卑,去實現(xiàn)那些抽象的接口會非常麻煩,工作量很大坊萝。這個時候就可以使用抽象類孵稽,這些抽象類中給我們提供了許多現(xiàn)成的實現(xiàn),我們只需要根據(jù)自己的需求重寫一些方法或者添加一些方法就可以實現(xiàn)自己需要的集合類十偶,工作流昂大大降低菩鲜。
2.Collection (集合的最大接口)繼承關(guān)系
——List 可以存放重復(fù)的內(nèi)容
——Set 不能存放重復(fù)的內(nèi)容,所以的重復(fù)內(nèi)容靠hashCode()和equals()兩個方法區(qū)分
——Queue 隊列接口
——SortedSet 可以對集合中的數(shù)據(jù)進行排序
Collection定義了集合框架的共性功能惦积。
add方法的參數(shù)類型是Object接校。以便于接收任意類型對象。
集合中存儲的都是對象的引用(地址)狮崩。
3蛛勉、List的常用子類
特有方法。凡是可以操作角標的方法都是該體系特有的方法睦柴。
——ArrayList 線程不安全诽凌,查詢速度快
——Vector 線程安全,但速度慢坦敌,已被ArrayList替代
——LinkedList 鏈表結(jié)果侣诵,增刪速度快
4、Set接口
Set:元素是無序(存入和取出的順序不一定一致)狱窘,元素不可以重復(fù)杜顺。
—— HashSet:底層數(shù)據(jù)結(jié)構(gòu)是哈希表。是線程不安全的蘸炸。不同步躬络。
HashSet是如何保證元素唯一性的呢?
是通過元素的兩個方法幻馁,hashCode和equals來完成洗鸵。
如果元素的HashCode值相同,才會判斷equals是否為true仗嗦。
如果元素的hashcode值不同膘滨,不會調(diào)用equals。
注意,對于判斷元素是否存在稀拐,以及刪除等操作火邓,依賴的方法是元素的hashcode和equals方法。
——TreeSet:
有序的存放:TreeSet 線程不安全,可以對Set集合中的元素進行排序
通過compareTo或者compare方法來保證元素的唯一性铲咨,元素以二叉樹的形式存放躲胳。
7、Map接口
Correction纤勒、Set坯苹、List接口都屬于單值的操作,而Map中的每個元素都使用key——>value的形式存儲在集合中摇天。
Map集合:該集合存儲鍵值對粹湃。一對一對往里存。而且要保證鍵的唯一性泉坐。
8为鳄、Map接口的常用子類
Map
——HashMap:底層是哈希表數(shù)據(jù)結(jié)構(gòu),允許使用 null 值和 null 鍵腕让,該集合是不同步的孤钦。
——HashTable:對HashMap個方法加鎖,線程安全纯丸,性能差偏形,已被廢棄,ConCurrentHashMap替代;
——TreeMap:底層是二叉樹數(shù)據(jù)結(jié)構(gòu)觉鼻。線程不同步壳猜。可以用于給map集合中的鍵進行排序滑凉。
HashMap數(shù)據(jù)結(jié)構(gòu)
在 JDK1.8 中,HashMap 是由 數(shù)組+鏈表+紅黑樹構(gòu)成(1.7版本是數(shù)組+鏈表)
當(dāng)一個值中要存儲到HashMap中的時候會根據(jù)Key的值來計算出他的hash喘帚,通過hash值來確認存放到數(shù)組中的位置畅姊,如果發(fā)生hash沖突就以鏈表的形式存儲,當(dāng)鏈表過長的話吹由,HashMap會把這個鏈表轉(zhuǎn)換成紅黑樹來存儲若未,如圖所示:
9、集合工具類
Collections:集合框架的工具類倾鲫。里面定義的都是靜態(tài)方法粗合。
Collections和Collection有什么區(qū)別?
Collection是集合框架中的一個頂層接口乌昔,它里面定義了單列集合的共性方法隙疚。
它有兩個常用的子接口,
——List:對元素都有定義索引磕道。有序的供屉。可以重復(fù)元素。
——Set:不可以重復(fù)元素伶丐。無序悼做。
Collections是集合框架中的一個工具類。該類中的方法都是靜態(tài)的哗魂。
提供的方法中有可以對list集合進行排序肛走,二分查找等方法。
通常常用的集合都是線程不安全的录别。因為要提高效率朽色。
如果多線程操作這些集合時,可以通過該工具類中的同步方法庶灿,將線程不安全的集合纵搁,轉(zhuǎn)換成安全的。
10.比較
11.總結(jié):
List:add/remove/get/set往踢。
1腾誉,ArrayList:其實就是數(shù)組,容量一大峻呕,頻繁增刪就是噩夢利职,適合隨機查找;
2瘦癌,LinkedList:增加了push/[pop|remove|pull]猪贪,其實都是removeFirst;
3讯私,Vector:歷史遺留產(chǎn)物热押,同步版的ArrayList,代碼和ArrayList太像斤寇;
4桶癣,Stack:繼承自Vector。Java里其實沒有純粹的Stack娘锁,可以自己實現(xiàn)牙寞,用組合的方式,封裝一下LinkedList即可莫秆;
5间雀,Queue:本來是單獨的一類,不過在SUN的JDK里就是用LinkedList來提供這個功能的镊屎,主要方法是offer/pull/peek惹挟,因此歸到這里呢。
Set:add/remove杯道》嘶停可以用迭代器或者轉(zhuǎn)換成list责蝠。
1,HashSet:內(nèi)部采用HashMap實現(xiàn)的萎庭;
2霜医,LinkedHashSet:采用LinkedHashMap實現(xiàn);
3驳规,TreeSet:TreeMap肴敛。
Map:put/get/remove。
1吗购,HashMap/HashTable:散列表医男,和ArrayList一樣采用數(shù)組實現(xiàn),超過初始容量會對性能有損耗捻勉;
2镀梭,LinkedHashMap:繼承自HashMap,但通過重寫嵌套類HashMap.Entry實現(xiàn)了鏈表結(jié)構(gòu)踱启,同樣有容量的問題报账;
3,Properties:是繼承的HashTable埠偿。
順便說一下Arrays.asList透罢,這個方法的實現(xiàn)依賴一個嵌套類,這個嵌套類也叫ArrayList冠蒋!