集合類之間的繼承關(guān)系:
Set集合
Set集合不允許包含相同的元素鹅龄,如果試圖把兩個(gè)相同的元素加入同一個(gè)Set集合中,則添加操作失敗,add()方法返回false署浩,且新元素不會(huì)被加入。
一扫尺、HashSet類
HashSet是Set接口的典型實(shí)現(xiàn)筋栋,實(shí)現(xiàn)了Set接口中的所有方法,并沒有添加額外的方法正驻,大多數(shù)時(shí)候使用Set集合時(shí)就是使用這個(gè)實(shí)現(xiàn)類弊攘。HashSet按Hash算法來存儲(chǔ)集合中的元素。因此具有很好的存取和查找性能姑曙。
HashSet特點(diǎn):
1.不能保證元素的排列順序襟交,順序可能與添加順序不同,順序也有可能發(fā)生變化伤靠。
2.HashSet不是同步的捣域,如果多個(gè)線程同時(shí)訪問一個(gè)HashSet,則必須通過代碼來保證其同步醋界。
3.集合元素值可以是null竟宋。
除此之外,HashSet判斷兩個(gè)元素是否相等的標(biāo)準(zhǔn)也是其一大特點(diǎn)形纺。HashSet集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是兩個(gè)對(duì)象通過equals()方法比較相等丘侠,并且兩個(gè)對(duì)象的hashCode()方法返回值也相等。
LinkedHashSet類
LinkedHashSet是HashSet對(duì)的子類逐样,也是根據(jù)元素的hashCode值來決定元素的存儲(chǔ)位置蜗字,同時(shí)使用鏈表維護(hù)元素的次序,使得元素是以插入的順序來保存的脂新。當(dāng)遍歷LinkedHashSet集合里的元素時(shí)挪捕,LinkedHashSet將會(huì)按元素的添加順序來訪問集合里的元素。但是由于要維護(hù)元素的插入順序争便,在性能上略低與HashSet级零,但在迭代訪問Set里的全部元素時(shí)有很好的性能。
注意:LinkedHashSet依然不允許元素重復(fù)滞乙,判斷重復(fù)標(biāo)準(zhǔn)與HashSet一致奏纪。
補(bǔ)充:HashSet的實(shí)質(zhì)是一個(gè)HashMap。HashSet的所有集合元素斩启,構(gòu)成了HashMap的key序调,其value為一個(gè)靜態(tài)Object對(duì)象。因此HashSet的所有性質(zhì)兔簇,HashMap的key所構(gòu)成的集合都具備发绢。
二硬耍、TreeSet類
TreeSet簡介
TreeSet中所謂的有序,不同于之前所講的插入順序边酒,而是通過集合中元素屬性進(jìn)行排序方式來實(shí)現(xiàn)的经柴。
比較器Comparator:
List集合
一、ArrayList
ArrayList和Vector作為List類的兩個(gè)典型實(shí)現(xiàn)墩朦,完全支持之前介紹的List接口的全部功能口锭。
ArrayList和Vector類都是基于數(shù)組實(shí)現(xiàn)的List類,所以ArrayList和Vector類封裝了一個(gè)動(dòng)態(tài)的介杆、允許再分配的Object[]數(shù)組鹃操。ArrayList或Vector對(duì)象使用initalCapacity參數(shù)來設(shè)置該數(shù)組的長度,當(dāng)向ArrayList或Vector中添加元素超過了該數(shù)組的長度時(shí)春哨,它們的initalCapacity會(huì)自動(dòng)增加荆隘。
ArrayList和Vector的區(qū)別:
1.ArrayList是線程不安全的,Vector是線程安全的赴背。
2.Vector的性能比ArrayList差椰拒。
二、LinkedList
LinkedList類是List接口的實(shí)現(xiàn)類——這意味著它是一個(gè)List集合凰荚,可以根據(jù)索引來隨機(jī)訪問集合中的元素燃观。除此之外,LinkedList還實(shí)現(xiàn)了Deque接口便瑟,可以被當(dāng)作成雙端隊(duì)列來使用缆毁,因此既可以被當(dāng)成“棧"來使用,也可以當(dāng)成隊(duì)列來使用到涂。
LinkedList的實(shí)現(xiàn)機(jī)制與ArrayList完全不同脊框。ArrayList內(nèi)部是以數(shù)組的形式來保存集合中的元素的,因此隨機(jī)訪問集合元素時(shí)有較好的性能践啄;而LinkedList內(nèi)部以鏈表的形式來保存集合中的元素浇雹,因此隨機(jī)訪問集合元素時(shí)性能較差,但在插入屿讽、刪除元素時(shí)性能比較出色昭灵。
!ArrayList與LinkedList性能對(duì)比伐谈!
ArrayList 是一個(gè)數(shù)組隊(duì)列烂完,相當(dāng)于動(dòng)態(tài)數(shù)組。它由數(shù)組實(shí)現(xiàn)衩婚,隨機(jī)訪問效率高窜护,隨機(jī)插入效斑、隨機(jī)刪除效率低非春。ArrayList應(yīng)使用隨機(jī)訪問(即,通過索引序號(hào)訪問)遍歷集合元素。
LinkedList 是一個(gè)雙向鏈表奇昙。它也可以被當(dāng)作堆棧护侮、隊(duì)列或雙端隊(duì)列進(jìn)行操作。LinkedList隨機(jī)訪問效率低储耐,但隨機(jī)插入羊初、隨機(jī)刪除效率高。LinkedList應(yīng)使用采用逐個(gè)遍歷的方式遍歷集合元素什湘。
(01) 對(duì)于需要快速插入长赞,刪除元素,應(yīng)該使用LinkedList闽撤。
(02) 對(duì)于需要快速隨機(jī)訪問元素得哆,應(yīng)該使用ArrayList。
(03) 對(duì)于“單線程環(huán)境” 或者 “多線程環(huán)境哟旗,但List僅僅只會(huì)被單個(gè)線程操作”贩据,此時(shí)應(yīng)該使用非同步的類(如ArrayList)。對(duì)于“多線程環(huán)境闸餐,且List可能同時(shí)被多個(gè)線程操作”饱亮,此時(shí),應(yīng)該使用同步的類(如Vector)舍沙。
HashMap與Hashtable的區(qū)別
1.Hashtable是一個(gè)線程安全的Map實(shí)現(xiàn)近上,但HashMap是線程不安全的實(shí)現(xiàn),所以HashMap比Hashtable的性能好一些拂铡;但如果有多個(gè)線程訪問同一個(gè)Map對(duì)象時(shí)戈锻,是盜用Hashtable實(shí)現(xiàn)類會(huì)更好。
2.Hashtable不允許使用null作為key和value和媳,如果試圖把null值放進(jìn)Hashtable中格遭,將會(huì)引發(fā)NullPointerException異常;但是HashMap可以使用null作為key或value留瞳。
TreeMap
TreeMap是SortedMap接口的實(shí)現(xiàn)類拒迅。TreeMap 是一個(gè)有序的key-value集合,它是通過紅黑樹實(shí)現(xiàn)的她倘。
Map實(shí)現(xiàn)類的性能分析及適用場景
HashMap與Hashtable實(shí)現(xiàn)機(jī)制幾乎一樣璧微,但是HashMap比Hashtable性能更好些。
LinkedHashMap比HashMap慢一點(diǎn)硬梁,因?yàn)樗枰S護(hù)一個(gè)雙向鏈表前硫。
TreeMap比HashMap與Hashtable慢(尤其在插入、刪除key-value時(shí)更慢)荧止,因?yàn)門reeMap底層采用紅黑樹來管理鍵值對(duì)屹电。
適用場景:
一般的應(yīng)用場景阶剑,盡可能多考慮使用HashMap,因?yàn)槠錇榭焖俨樵冊O(shè)計(jì)的危号。
如果需要特定的排序時(shí)牧愁,考慮使用TreeMap。
如果僅僅需要插入的順序時(shí)外莲,考慮使用LinkedHashMap猪半。