集合類(lèi)框架 接口

集合類(lèi)框架的介紹:?

![Java 集合類(lèi)框架](https://upload-images.jianshu.io/upload_images/10933932-2532002bd56e06ff.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

1.所有集合類(lèi)都位于java.util包下著榴。Java的集合類(lèi)主要由兩個(gè)接口派生而出:CollectionMap,Collection和Map是Java集合框架的根接口,這兩個(gè)接口又包含了一些子接口或?qū)崿F(xiàn)類(lèi)伪货。

2. 集合接口:6個(gè)接口(短虛線表示)赶盔,表示不同集合類(lèi)型勒魔,是集合框架的基礎(chǔ)融痛。

3. 抽象類(lèi):5個(gè)抽象類(lèi)(長(zhǎng)虛線表示)藤韵,對(duì)集合接口的部分實(shí)現(xiàn)凛膏⊙蠲可擴(kuò)展為自定義集合類(lèi)。

4. 實(shí)現(xiàn)類(lèi):8個(gè)實(shí)現(xiàn)類(lèi)(實(shí)線表示)猖毫,對(duì)接口的具體實(shí)現(xiàn)台谍。

5. Collection 接口是一組允許重復(fù)的對(duì)象。

6. Set 接口繼承 Collection吁断,集合元素不重復(fù)趁蕊。

7. List 接口繼承 Collection,允許重復(fù)仔役,維護(hù)元素插入順序掷伙。

8. Map接口是鍵-值對(duì)象,與Collection接口沒(méi)有什么關(guān)系骂因。

9.Set炎咖、List和Map可以看做集合的三大類(lèi):

List集合是有序集合,集合中的元素可以重復(fù),訪問(wèn)集合中的元素可以根據(jù)元素的索引來(lái)訪問(wèn)乘盼。

Set集合是無(wú)序集合升熊,集合中的元素不可以重復(fù),訪問(wèn)集合中的元素只能根據(jù)元素本身來(lái)訪問(wèn)(也是集合里元素不允許重復(fù)的原因)绸栅。

Map集合中保存Key-value對(duì)形式的元素级野,訪問(wèn)時(shí)只能根據(jù)每項(xiàng)元素的key來(lái)訪問(wèn)其value。


集合類(lèi)框架圖

1、Collection是一個(gè)接口,是高度抽象出來(lái)的集合晌端,它包含了集合的基本操作和屬性豪嚎。Collection包含了List和Set兩大分支蓖救。

(1)List是一個(gè)有序的隊(duì)列,每一個(gè)元素都有它的索引。第一個(gè)元素的索引值是0。List的實(shí)現(xiàn)類(lèi)有LinkedList, ArrayList, Vector, Stack镐捧。

(2)Set是一個(gè)不允許有重復(fù)元素的集合。Set的實(shí)現(xiàn)類(lèi)有HastSet和TreeSet臭增。HashSet依賴于HashMap懂酱,它實(shí)際上是通過(guò)HashMap實(shí)現(xiàn)的;TreeSet依賴于TreeMap誊抛,它實(shí)際上是通過(guò)TreeMap實(shí)現(xiàn)的列牺。

2、Map是一個(gè)映射接口拗窃,即key-value鍵值對(duì)瞎领。Map中的每一個(gè)元素包含“一個(gè)key”和“key對(duì)應(yīng)的value”。AbstractMap是個(gè)抽象類(lèi)随夸,它實(shí)現(xiàn)了Map接口中的大部分API默刚。而HashMap,TreeMap逃魄,WeakHashMap都是繼承于AbstractMap。Hashtable雖然繼承于Dictionary澜搅,但它實(shí)現(xiàn)了Map接口伍俘。

3、接下來(lái)勉躺,再看Iterator癌瘾。它是遍歷集合的工具,即我們通常通過(guò)Iterator迭代器來(lái)遍歷集合饵溅。我們說(shuō)Collection依賴于Iterator妨退,是因?yàn)镃ollection的實(shí)現(xiàn)類(lèi)都要實(shí)現(xiàn)iterator()函數(shù),返回一個(gè)Iterator對(duì)象。ListIterator是專(zhuān)門(mén)為遍歷List而存在的咬荷。

4冠句、再看Enumeration,它是JDK 1.0引入的抽象類(lèi)幸乒。作用和Iterator一樣懦底,也是遍歷集合;但是Enumeration的功能要比Iterator少罕扎。在上面的框圖中聚唐,Enumeration只能在Hashtable, Vector, Stack中使用。

5腔召、最后杆查,看Arrays和Collections。它們是操作數(shù)組臀蛛、集合的兩個(gè)工具類(lèi)亲桦。

有了上面的整體框架之后,我們接下來(lái)對(duì)每個(gè)類(lèi)分別進(jìn)行分析掺栅。

三烙肺、Collection接口

Collection接口是處理對(duì)象集合的根接口,其中定義了很多對(duì)元素進(jìn)行操作的方法氧卧。Collection接口有兩個(gè)主要的子接口ListSet桃笙,注意Map不是Collection的子接口,這個(gè)要牢記沙绝。

Collection接口中的方法如下:?


Collection 接口結(jié)構(gòu)

其中搏明,有幾個(gè)比較常用的方法,比如方法add()添加一個(gè)元素到集合中闪檬,addAll()將指定集合中的所有元素添加到集合中星著,contains()方法檢測(cè)集合中是否包含指定的元素,toArray()方法返回一個(gè)表示集合的數(shù)組粗悯。

另外虚循,Collection中有一個(gè)iterator()函數(shù),它的作用是返回一個(gè)Iterator接口样傍。通常横缔,我們通過(guò)Iterator迭代器來(lái)遍歷集合。ListIterator是List接口所特有的衫哥,在List接口中茎刚,通過(guò)ListIterator()返回一個(gè)ListIterator對(duì)象。

Collection接口有兩個(gè)常用的子接口撤逢,下面詳細(xì)介紹膛锭。

1.List接口

List集合代表一個(gè)有序集合粮坞,集合中每個(gè)元素都有其對(duì)應(yīng)的順序索引。List集合允許使用重復(fù)元素初狰,可以通過(guò)索引來(lái)訪問(wèn)指定位置的集合元素莫杈。

List接口繼承于Collection接口,它可以定義一個(gè)允許重復(fù)有序集合跷究。因?yàn)長(zhǎng)ist中的元素是有序的姓迅,所以我們可以通過(guò)使用索引(元素在List中的位置,類(lèi)似于數(shù)組下標(biāo))來(lái)訪問(wèn)List中的元素俊马,這類(lèi)似于Java的數(shù)組

List接口為Collection直接接口丁存。List所代表的是有序的Collection,即它用某種特定的插入順序來(lái)維護(hù)元素順序柴我。用戶可以對(duì)列表中每個(gè)元素的插入位置進(jìn)行精確地控制解寝,同時(shí)可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問(wèn)元素,并搜索列表中的元素艘儒。實(shí)現(xiàn)List接口的集合主要有:ArrayList聋伦、LinkedList、Vector界睁、Stack觉增。

ArrayList是一個(gè)動(dòng)態(tài)數(shù)組,也是我們最常用的集合翻斟。它允許任何符合規(guī)則的元素插入甚至包括null逾礁。每一個(gè)ArrayList都有一個(gè)初始容量(10),該容量代表了數(shù)組的大小访惜。隨著容器中的元素不斷增加(按照增加到原來(lái)容量的1.5 倍)嘹履,容器的大小也會(huì)隨著增加。在每次向容器中增加元素的同時(shí)都會(huì)進(jìn)行容量檢查债热,當(dāng)快溢出時(shí)砾嫉,就會(huì)進(jìn)行擴(kuò)容操作。所以如果我們明確所插入元素的多少窒篱,最好指定一個(gè)初始容量值焕刮,避免過(guò)多的進(jìn)行擴(kuò)容操作而浪費(fèi)時(shí)間、效率墙杯。

????? size济锄、isEmpty、get霍转、set、iterator 和 listIterator 操作都以固定時(shí)間運(yùn)行一汽。add 操作以分?jǐn)偟墓潭〞r(shí)間運(yùn)行避消,也就是說(shuō)低滩,添加 n 個(gè)元素需要 O(n) 時(shí)間(由于要考慮到擴(kuò)容,所以這不只是添加元素會(huì)帶來(lái)分?jǐn)偣潭〞r(shí)間開(kāi)銷(xiāo)那樣簡(jiǎn)單)岩喷。

?ArrayList擅長(zhǎng)于隨機(jī)訪問(wèn)恕沫。同時(shí)ArrayList是非同步的。

(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ī)訪問(wèn)叙身,它所有的操作都是要按照雙重鏈表的需要執(zhí)行。在列表中索引的操作將從開(kāi)頭或結(jié)尾遍歷列表(從靠近指定索引的一端)硫狞。這樣做的好處就是可以通過(guò)較低的代價(jià)在List中進(jìn)行插入和刪除操作信轿。

與ArrayList一樣,LinkedList也是非同步的残吩。如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)List财忽,則必須自己實(shí)現(xiàn)訪問(wèn)同步。一種解決方法是在創(chuàng)建List時(shí)構(gòu)造一個(gè)同步的List:?

List list = Collections.synchronizedList(new LinkedList(...));

(3)Vector

與ArrayList相似泣侮,但是Vector是同步的即彪。所以說(shuō)Vector是線程安全的動(dòng)態(tài)數(shù)組。它的操作與ArrayList幾乎一樣旁瘫。

4)Stack

???? Stack繼承自Vector祖凫,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧。Stack提供5個(gè)額外的方法使得Vector得以被當(dāng)作堆棧使用酬凳』菘觯基本的push和pop 方法,還有peek方法得到棧頂?shù)脑啬校琫mpty方法測(cè)試堆棧是否為空稠屠,search方法檢測(cè)一個(gè)元素在堆棧中的位置。Stack剛創(chuàng)建后是空棧翎苫。


2.Set接口

Set是一種不包括重復(fù)元素的Collection权埠。它維持它自己的內(nèi)部排序,所以隨機(jī)訪問(wèn)沒(méi)有任何意義煎谍。與List一樣攘蔽,它同樣允許null的存在但是僅有一個(gè)。由于Set接口的特殊性呐粘,所有傳入Set集合中的元素都必須不同满俗,同時(shí)要注意任何可變對(duì)象转捕,如果在對(duì)集合中元素進(jìn)行操作時(shí),導(dǎo)致e1.equals(e2)==true唆垃,則必定會(huì)產(chǎn)生某些問(wèn)題五芝。Set接口有三個(gè)具體實(shí)現(xiàn)類(lèi),分別是散列集HashSet辕万、鏈?zhǔn)缴⒘屑疞inkedHashSet和樹(shù)形集TreeSet枢步。

??? Set是一種不包含重復(fù)的元素的Collection,無(wú)序渐尿,即任意的兩個(gè)元素e1和e2都有e1.equals(e2)=false醉途,Set最多有一個(gè)null元素。需要注意的是:雖然Set中元素沒(méi)有順序涡戳,但是元素在set中的位置是由該元素的HashCode決定的结蟋,其具體位置其實(shí)是固定的。

? 此外需要說(shuō)明一點(diǎn)渔彰,在set接口中的不重復(fù)是有特殊要求的嵌屎。

???? 舉一個(gè)例子:對(duì)象A和對(duì)象B,本來(lái)是不同的兩個(gè)對(duì)象恍涂,正常情況下它們是能夠放入到Set里面的宝惰,但是如果對(duì)象A和B的都重寫(xiě)了hashcode和equals方法,并且重寫(xiě)后的hashcode和equals方法是相同的話再沧。那么A和B是不能同時(shí)放入到Set集合中去的尼夺,也就是Set集合中的去重和hashcode與equals方法直接相關(guān)。 炒瘸。

(1)HashSet

HashSet 是一個(gè)沒(méi)有重復(fù)元素的集合淤堵。它是由HashMap實(shí)現(xiàn)的不保證元素的順序(這里所說(shuō)的沒(méi)有順序是指:元素插入的順序與輸出的順序不一致)顷扩,而且HashSet允許使用null 元素拐邪。HashSet是非同步的,如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)哈希set隘截,而其中至少一個(gè)線程修改了該set扎阶,那么它必須保持外部同步。HashSet按Hash算法來(lái)存儲(chǔ)集合的元素婶芭,因此具有很好的存取和查找性能东臀。

HashSet的實(shí)現(xiàn)方式大致如下,通過(guò)一個(gè)HashMap存儲(chǔ)元素犀农,元素是存放在HashMap的Key中惰赋,而Value統(tǒng)一使用一個(gè)Object對(duì)象。

HashSet使用和理解中容易出現(xiàn)的誤區(qū):

a.HashSet中存放null值

HashSet中是允許存入null值的呵哨,但是在HashSet中僅僅能夠存入一個(gè)null值赁濒。

b.HashSet中存儲(chǔ)元素的位置是固定的

HashSet中存儲(chǔ)的元素的是無(wú)序的贵扰,這個(gè)沒(méi)什么好說(shuō)的,但是由于HashSet底層是基于Hash算法實(shí)現(xiàn)的流部,使用了hashcode,所以HashSet中相應(yīng)的元素的位置是固定的纹坐。

c.必須小心操作可變對(duì)象(Mutable Object)枝冀。如果一個(gè)Set中的可變?cè)馗淖兞俗陨頎顟B(tài)導(dǎo)致Object.equals(Object)=true將導(dǎo)致一些問(wèn)題。

2)LinkedHashSet

LinkedHashSet繼承自HashSet耘子,其底層是基于LinkedHashMap來(lái)實(shí)現(xiàn)的果漾,有序,非同步谷誓。LinkedHashSet集合同樣是根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置绒障,但是它同時(shí)使用鏈表維護(hù)元素的次序。這樣使得元素看起來(lái)像是以插入順序保存的捍歪,也就是說(shuō)户辱,當(dāng)遍歷該集合時(shí)候,LinkedHashSet將會(huì)以元素的添加順序訪問(wèn)集合的元素糙臼。

(3)TreeSet

TreeSet是一個(gè)有序集合庐镐,其底層是基于TreeMap實(shí)現(xiàn)的,非線程安全变逃。TreeSet可以確保集合元素處于排序狀態(tài)必逆。TreeSet支持兩種排序方式,自然排序和定制排序揽乱,其中自然排序?yàn)槟J(rèn)的排序方式名眉。當(dāng)我們構(gòu)造TreeSet時(shí),若使用不帶參數(shù)的構(gòu)造函數(shù)凰棉,則TreeSet的使用自然比較器损拢;若用戶需要使用自定義的比較器,則需要使用帶比較器的參數(shù)渊啰。

注意:TreeSet集合不是通過(guò)hashcode和equals函數(shù)來(lái)比較元素的.它是通過(guò)compare或者comparaeTo函數(shù)來(lái)判斷元素是否相等.compare函數(shù)通過(guò)判斷兩個(gè)對(duì)象的id探橱,相同的id判斷為重復(fù)元素,不會(huì)被加入到集合中绘证。

四隧膏、Map接口

Map與List、Set接口不同嚷那,它是由一系列鍵值對(duì)組成的集合胞枕,提供了key到Value的映射。同時(shí)它也沒(méi)有繼承Collection魏宽。在Map中它保證了key與value之間的一一對(duì)應(yīng)關(guān)系腐泻。也就是說(shuō)一個(gè)key對(duì)應(yīng)一個(gè)value决乎,所以它不能存在相同的key值,當(dāng)然value值可以相同派桩。

1.HashMap

????? 以哈希表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)构诚,查找對(duì)象時(shí)通過(guò)哈希函數(shù)計(jì)算其位置,它是為快速查詢而設(shè)計(jì)的铆惑,其內(nèi)部定義了一個(gè)hash表數(shù)組(Entry[] table)范嘱,元素會(huì)通過(guò)哈希轉(zhuǎn)換函數(shù)將元素的哈希地址轉(zhuǎn)換成數(shù)組中存放的索引,如果有沖突员魏,則使用散列鏈表的形式將所有相同哈希地址的元素串起來(lái)丑蛤,可能通過(guò)查看HashMap.Entry的源碼它是一個(gè)單鏈表結(jié)構(gòu)。

2.LinkedHashMap

LinkedHashMap是HashMap的一個(gè)子類(lèi)撕阎,它保留插入的順序受裹,如果需要輸出的順序和輸入時(shí)的相同,那么就選用LinkedHashMap虏束。

LinkedHashMap是Map接口的哈希表和鏈接列表實(shí)現(xiàn)棉饶,具有可預(yù)知的迭代順序。此實(shí)現(xiàn)提供所有可選的映射操作魄眉,并允許使用null值和null鍵砰盐。此類(lèi)不保證映射的順序,特別是它不保證該順序恒久不變坑律。

?LinkedHashMap實(shí)現(xiàn)與HashMap的不同之處在于岩梳,后者維護(hù)著一個(gè)運(yùn)行于所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序晃择,該迭代順序可以是插入順序或者是訪問(wèn)順序冀值。

???? 根據(jù)鏈表中元素的順序可以分為:按插入順序的鏈表,和按訪問(wèn)順序(調(diào)用get方法)的鏈表宫屠。默認(rèn)是按插入順序排序列疗,如果指定按訪問(wèn)順序排序,那么調(diào)用get方法后浪蹂,會(huì)將這次訪問(wèn)的元素移至鏈表尾部抵栈,不斷訪問(wèn)可以形成按訪問(wèn)順序排序的鏈表。

注意坤次,此實(shí)現(xiàn)不是同步的古劲。如果多個(gè)線程同時(shí)訪問(wèn)鏈接的哈希映射,而其中至少一個(gè)線程從結(jié)構(gòu)上修改了該映射缰猴,則它必須保持外部同步产艾。

???? 由于LinkedHashMap需要維護(hù)元素的插入順序,因此性能略低于HashMap的性能,但在迭代訪問(wèn)Map里的全部元素時(shí)將有很好的性能闷堡,因?yàn)樗枣湵韥?lái)維護(hù)內(nèi)部順序隘膘。


3.TreeMap

TreeMap 是一個(gè)有序的key-value集合,非同步杠览,基于紅黑樹(shù)(Red-Black tree)實(shí)現(xiàn)弯菊,每一個(gè)key-value節(jié)點(diǎn)作為紅黑樹(shù)的一個(gè)節(jié)點(diǎn)。TreeMap存儲(chǔ)時(shí)會(huì)進(jìn)行排序的踱阿,會(huì)根據(jù)key來(lái)對(duì)key-value鍵值對(duì)進(jìn)行排序误续,其中排序方式也是分為兩種,一種是自然排序扫茅,一種是定制排序,具體取決于使用的構(gòu)造方法育瓜。

自然排序:TreeMap中所有的key必須實(shí)現(xiàn)Comparable接口葫隙,并且所有的key都應(yīng)該是同一個(gè)類(lèi)的對(duì)象,否則會(huì)報(bào)ClassCastException異常躏仇。

定制排序:定義TreeMap時(shí)恋脚,創(chuàng)建一個(gè)comparator對(duì)象,該對(duì)象對(duì)所有的treeMap中所有的key值進(jìn)行排序焰手,采用定制排序的時(shí)候不需要TreeMap中所有的key必須實(shí)現(xiàn)Comparable接口糟描。

TreeMap判斷兩個(gè)元素相等的標(biāo)準(zhǔn):兩個(gè)key通過(guò)compareTo()方法返回0,則認(rèn)為這兩個(gè)key相等书妻。

如果使用自定義的類(lèi)來(lái)作為T(mén)reeMap中的key值船响,且想讓TreeMap能夠良好的工作,則必須重寫(xiě)自定義類(lèi)中的equals()方法躲履,TreeMap中判斷相等的標(biāo)準(zhǔn)是:兩個(gè)key通過(guò)equals()方法返回為true见间,并且通過(guò)compareTo()方法比較應(yīng)該返回為0。


五工猜、Iterator 與 ListIterator詳解

1.Iterator

Iterator的定義如下:

Iterator是一個(gè)接口米诉,它是集合的迭代器。集合可以通過(guò)Iterator去遍歷集合中的元素篷帅。Iterator提供的API接口如下:

boolean hasNext():判斷集合里是否存在下一個(gè)元素史侣。如果有,hasNext()方法返回 true魏身。

Object next():返回集合里下一個(gè)元素惊橱。

void remove():刪除集合里上一次next方法返回的元素。

注意:

(1)Iterator只能單向移動(dòng)叠骑。

(2)Iterator.remove()是唯一安全的方式來(lái)在迭代過(guò)程中修改集合李皇;如果在迭代過(guò)程中以任何其它的方式修改了基本集合將會(huì)產(chǎn)生未知的行為。而且每調(diào)用一次next()方法,remove()方法只能被調(diào)用一次掉房,如果違反這個(gè)規(guī)則將拋出一個(gè)異常茧跋。

2.ListIterator

ListIterator是一個(gè)功能更加強(qiáng)大的迭代器, 它繼承于Iterator接口,只能用于各種List類(lèi)型的訪問(wèn)∽壳簦可以通過(guò)調(diào)用listIterator()方法產(chǎn)生一個(gè)指向List開(kāi)始處的ListIterator, 還可以調(diào)用listIterator(n)方法創(chuàng)建一個(gè)一開(kāi)始就指向列表索引為n的元素處的ListIterator.

ListIterator接口定義如下:

由以上定義我們可以推出ListIterator可以:

(1)雙向移動(dòng)(向前/向后遍歷).

(2)產(chǎn)生相對(duì)于迭代器在列表中指向的當(dāng)前位置的前一個(gè)和后一個(gè)元素的索引.

(3)可以使用set()方法替換它訪問(wèn)過(guò)的最后一個(gè)元素.

(4)可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一個(gè)元素.

使用示例:

六瘾杭、異同點(diǎn)

1.ArrayList和LinkedList

(1)ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)哪亿。?

(2)對(duì)于隨機(jī)訪問(wèn)get和set粥烁,ArrayList絕對(duì)優(yōu)于LinkedList,因?yàn)長(zhǎng)inkedList要移動(dòng)指針蝇棉。

(3)對(duì)于新增和刪除操作add和remove讨阻,LinedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)篡殷。

這一點(diǎn)要看實(shí)際情況的钝吮。若只對(duì)單條數(shù)據(jù)插入或刪除,ArrayList的速度反而優(yōu)于LinkedList板辽。但若是批量隨機(jī)的插入刪除數(shù)據(jù)奇瘦,LinkedList的速度大大優(yōu)于ArrayList. 因?yàn)锳rrayList每插入一條數(shù)據(jù),要移動(dòng)插入點(diǎn)及之后的所有數(shù)據(jù)劲弦。

2.HashTable與HashMap

相同點(diǎn):

(1)都實(shí)現(xiàn)了Map耳标、Cloneable、java.io.Serializable接口邑跪。

(2)都是存儲(chǔ)"鍵值對(duì)(key-value)"的散列表次坡,而且都是采用拉鏈法實(shí)現(xiàn)的。

不同點(diǎn):

(1)歷史原因:HashTable是基于陳舊的Dictionary類(lèi)的画畅,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn) 贸毕。

(2)同步性:HashTable是線程安全的,也就是說(shuō)是同步的夜赵,而HashMap是線程序不安全的明棍,不是同步的 。

(3)對(duì)null值的處理:HashMap的key寇僧、value都可為null摊腋,HashTable的key、value都不可為null 嘁傀。

(4)基類(lèi)不同:HashMap繼承于AbstractMap兴蒸,而Hashtable繼承于Dictionary。

Dictionary是一個(gè)抽象類(lèi)细办,它直接繼承于Object類(lèi)橙凳,沒(méi)有實(shí)現(xiàn)任何接口蕾殴。Dictionary類(lèi)是JDK 1.0的引入的。雖然Dictionary也支持“添加key-value鍵值對(duì)”岛啸、“獲取value”钓觉、“獲取大小”等基本操作,但它的API函數(shù)比Map少坚踩;而且Dictionary一般是通過(guò)Enumeration(枚舉類(lèi))去遍歷荡灾,Map則是通過(guò)Iterator(迭代M器)去遍歷。 然而由于Hashtable也實(shí)現(xiàn)了Map接口瞬铸,所以批幌,它即支持Enumeration遍歷,也支持Iterator遍歷嗓节。

AbstractMap是一個(gè)抽象類(lèi)荧缘,它實(shí)現(xiàn)了Map接口的絕大部分API函數(shù);為Map的具體實(shí)現(xiàn)類(lèi)提供了極大的便利拦宣。它是JDK 1.2新增的類(lèi)胜宇。


(5)支持的遍歷種類(lèi)不同:HashMap只支持Iterator(迭代器)遍歷。而Hashtable支持Iterator(迭代器)和Enumeration(枚舉器)兩種方式遍歷恢着。


3.HashMap、Hashtable财破、LinkedHashMap和TreeMap比較

Hashmap 是一個(gè)最常用的Map掰派,它根據(jù)鍵的HashCode 值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值左痢,具有很快的訪問(wèn)速度靡羡。遍歷時(shí),取得數(shù)據(jù)的順序是完全隨機(jī)的俊性。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;HashMap不支持線程的同步略步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫(xiě)HashMap;可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要同步定页,可以用Collections的synchronizedMap方法使HashMap具有同步的能力趟薄。

Hashtable 與 HashMap類(lèi)似,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步典徊,即任一時(shí)刻只有一個(gè)線程能寫(xiě)Hashtable杭煎,因此也導(dǎo)致了Hashtale在寫(xiě)入時(shí)會(huì)比較慢。

LinkedHashMap保存了記錄的插入順序卒落,在用Iterator遍歷LinkedHashMap時(shí)羡铲,先得到的記錄肯定是先插入的,也可以在構(gòu)造時(shí)用帶參數(shù)儡毕,按照應(yīng)用次數(shù)排序也切。在遍歷的時(shí)候會(huì)比HashMap慢,不過(guò)有種情況例外,當(dāng)HashMap容量很大雷恃,實(shí)際數(shù)據(jù)較少時(shí)疆股,遍歷起來(lái)可能會(huì)比LinkedHashMap慢,因?yàn)長(zhǎng)inkedHashMap的遍歷速度只和實(shí)際數(shù)據(jù)有關(guān)褂萧,和容量無(wú)關(guān)押桃,而HashMap的遍歷速度和他的容量有關(guān)。如果需要輸出的順序和輸入的相同导犹,那么用LinkedHashMap可以實(shí)現(xiàn)唱凯,它還可以按讀取順序來(lái)排列,像連接池中可以應(yīng)用谎痢。LinkedHashMap實(shí)現(xiàn)與HashMap的不同之處在于磕昼,后者維護(hù)著一個(gè)運(yùn)行于所有條目的雙重鏈表。此鏈接列表定義了迭代順序节猿,該迭代順序可以是插入順序或者是訪問(wèn)順序票从。對(duì)于LinkedHashMap而言,它繼承與HashMap滨嘱、底層使用哈希表與雙向鏈表來(lái)保存所有元素峰鄙。其基本操作與父類(lèi)HashMap相似,它通過(guò)重寫(xiě)父類(lèi)相關(guān)的方法太雨,來(lái)實(shí)現(xiàn)自己的鏈接列表特性吟榴。

TreeMap實(shí)現(xiàn)SortMap接口,內(nèi)部實(shí)現(xiàn)是紅黑樹(shù)囊扳。能夠把它保存的記錄根據(jù)鍵排序吩翻,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器锥咸,當(dāng)用Iterator 遍歷TreeMap時(shí)狭瞎,得到的記錄是排過(guò)序的。TreeMap不允許key的值為null搏予。非同步的熊锭。

一般情況下,我們用的最多的是HashMap雪侥,HashMap里面存入的鍵值對(duì)在取出的時(shí)候是隨機(jī)的球涛,它根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值校镐,具有很快的訪問(wèn)速度亿扁。在Map 中插入、刪除和定位元素鸟廓,HashMap 是最好的選擇从祝。

TreeMap取出來(lái)的是排序后的鍵值對(duì)襟己。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會(huì)更好牍陌。

LinkedHashMap 是HashMap的一個(gè)子類(lèi)擎浴,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實(shí)現(xiàn)毒涧,它還可以按讀取順序來(lái)排列贮预,像連接池中可以應(yīng)用。

4.HashSet契讲、LinkedHashSet仿吞、TreeSet比較

Set接口

Set不允許包含相同的元素,如果試圖把兩個(gè)相同元素加入同一個(gè)集合中捡偏,add方法返回false唤冈。

Set判斷兩個(gè)對(duì)象相同不是使用==運(yùn)算符,而是根據(jù)equals方法银伟。也就是說(shuō)你虹,只要兩個(gè)對(duì)象用equals方法比較返回true,Set就不會(huì)接受這兩個(gè)對(duì)象彤避。

HashSet

HashSet有以下特點(diǎn):

->? 不能保證元素的排列順序傅物,順序有可能發(fā)生變化。

->? 不是同步的琉预。

->? 集合元素可以是null董饰,但只能放入一個(gè)null。

當(dāng)向HashSet結(jié)合中存入一個(gè)元素時(shí)模孩,HashSet會(huì)調(diào)用該對(duì)象的hashCode()方法來(lái)得到該對(duì)象的hashCode值,然后根據(jù) hashCode值來(lái)決定該對(duì)象在HashSet中存儲(chǔ)位置贮缅。簡(jiǎn)單的說(shuō)榨咐,HashSet集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是兩個(gè)對(duì)象通過(guò)equals方法比較相等,并且兩個(gè)對(duì)象的hashCode()方法返回值也相等谴供。

注意块茁,如果要把一個(gè)對(duì)象放入HashSet中,重寫(xiě)該對(duì)象對(duì)應(yīng)類(lèi)的equals方法桂肌,也應(yīng)該重寫(xiě)其hashCode()方法数焊。其規(guī)則是如果兩個(gè)對(duì)象通過(guò)equals方法比較返回true時(shí),其hashCode也應(yīng)該相同崎场。另外佩耳,對(duì)象中用作equals比較標(biāo)準(zhǔn)的屬性,都應(yīng)該用來(lái)計(jì)算 hashCode的值谭跨。

LinkedHashSet

LinkedHashSet集合同樣是根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置干厚,但是它同時(shí)使用鏈表維護(hù)元素的次序李滴。這樣使得元素看起來(lái)像是以插入順序保存的,也就是說(shuō)蛮瞄,當(dāng)遍歷該集合時(shí)候所坯,LinkedHashSet將會(huì)以元素的添加順序訪問(wèn)集合的元素。

LinkedHashSet在迭代訪問(wèn)Set中的全部元素時(shí)挂捅,性能比HashSet好芹助,但是插入時(shí)性能稍微遜色于HashSet。

TreeSet類(lèi)

TreeSet是SortedSet接口的唯一實(shí)現(xiàn)類(lèi)闲先,TreeSet可以確保集合元素處于排序狀態(tài)状土。TreeSet支持兩種排序方式,自然排序和定制排序饵蒂,其中自然排序?yàn)槟J(rèn)的排序方式声诸。向TreeSet中加入的應(yīng)該是同一個(gè)類(lèi)的對(duì)象。

?TreeSet判斷兩個(gè)對(duì)象不相等的方式是兩個(gè)對(duì)象通過(guò)equals方法返回false退盯,或者通過(guò)CompareTo方法比較沒(méi)有返回0彼乌。

自然排序

自然排序使用要排序元素的CompareTo(Object obj)方法來(lái)比較元素之間大小關(guān)系,然后將元素按照升序排列渊迁。

Java提供了一個(gè)Comparable接口慰照,該接口里定義了一個(gè)compareTo(Object obj)方法,該方法返回一個(gè)整數(shù)值琉朽,實(shí)現(xiàn)了該接口的對(duì)象就可以比較大小毒租。obj1.compareTo(obj2)方法如果返回0,則說(shuō)明被比較的兩個(gè)對(duì)象相等箱叁,如果返回一個(gè)正數(shù)墅垮,則表明obj1大于obj2,如果是負(fù)數(shù)耕漱,則表明obj1小于obj2算色。如果我們將兩個(gè)對(duì)象的equals方法總是返回true,則這兩個(gè)對(duì)象的compareTo方法返回應(yīng)該返回0螟够。

定制排序

自然排序是根據(jù)集合元素的大小灾梦,以升序排列,如果要定制排序妓笙,應(yīng)該使用Comparator接口若河,實(shí)現(xiàn) int compare(T o1,T o2)方法。

5寞宫、Iterator和ListIterator區(qū)別

???? 我們?cè)谑褂肔ist萧福,Set的時(shí)候,為了實(shí)現(xiàn)對(duì)其數(shù)據(jù)的遍歷辈赋,我們經(jīng)常使用到了Iterator(迭代器)统锤。使用迭代器毛俏,你不需要干涉其遍歷的過(guò)程,只需要每次取出一個(gè)你想要的數(shù)據(jù)進(jìn)行處理就可以了饲窿。但是在使用的時(shí)候也是有不同的煌寇。List和Set都有iterator()來(lái)取得其迭代器。對(duì)List來(lái)說(shuō)逾雄,你也可以通過(guò)listIterator()取得其迭代器阀溶,兩種迭代器在有些時(shí)候是不能通用的,Iterator和ListIterator主要區(qū)別在以下方面:

(1)ListIterator有add()方法鸦泳,可以向List中添加對(duì)象银锻,而Iterator不能

(2)ListIterator和Iterator都有hasNext()和next()方法,可以實(shí)現(xiàn)順序向后遍歷做鹰,但是ListIterator有hasPrevious()和previous()方法击纬,可以實(shí)現(xiàn)逆向(順序向前)遍歷。Iterator就不可以钾麸。

(3)ListIterator可以定位當(dāng)前的索引位置更振,nextIndex()和previousIndex()可以實(shí)現(xiàn)。Iterator沒(méi)有此功能饭尝。

(4)都可實(shí)現(xiàn)刪除對(duì)象肯腕,但是ListIterator可以實(shí)現(xiàn)對(duì)象的修改,set()方法可以實(shí)現(xiàn)钥平。Iierator僅能遍歷实撒,不能修改。

因?yàn)長(zhǎng)istIterator的這些功能涉瘾,可以實(shí)現(xiàn)對(duì)LinkedList等List數(shù)據(jù)結(jié)構(gòu)的操作知态。其實(shí),數(shù)組對(duì)象也可以用迭代器來(lái)實(shí)現(xiàn)立叛。

6负敏、Collection 和 Collections區(qū)別

(1)java.util.Collection 是一個(gè)集合接口(集合類(lèi)的一個(gè)頂級(jí)接口)。它提供了對(duì)集合對(duì)象進(jìn)行基本操作的通用接口方法囚巴。Collection接口在Java 類(lèi)庫(kù)中有很多具體的實(shí)現(xiàn)原在。Collection接口的意義是為各種具體的集合提供了最大化的統(tǒng)一操作方式友扰,其直接繼承接口有List與Set彤叉。

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│ └Stack

└Set

(2)java.util.Collections 是一個(gè)包裝類(lèi)(工具類(lèi)/幫助類(lèi))。它包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法村怪。此類(lèi)不能實(shí)例化秽浇,就像一個(gè)工具類(lèi),用于對(duì)集合中元素進(jìn)行排序甚负、搜索以及線程安全等各種操作柬焕,服務(wù)于Java的Collection框架审残。

參考:https://www.cnblogs.com/xiaoxi/p/6089984.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市斑举,隨后出現(xiàn)的幾起案子搅轿,更是在濱河造成了極大的恐慌,老刑警劉巖富玷,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璧坟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赎懦,警方通過(guò)查閱死者的電腦和手機(jī)雀鹃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)励两,“玉大人黎茎,你說(shuō)我怎么就攤上這事〉被冢” “怎么了傅瞻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)先鱼。 經(jīng)常有香客問(wèn)我俭正,道長(zhǎng),這世上最難降的妖魔是什么焙畔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任掸读,我火速辦了婚禮,結(jié)果婚禮上宏多,老公的妹妹穿的比我還像新娘儿惫。我一直安慰自己,他們只是感情好伸但,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布肾请。 她就那樣靜靜地躺著,像睡著了一般更胖。 火紅的嫁衣襯著肌膚如雪送矩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天侦厚,我揣著相機(jī)與錄音盯质,去河邊找鬼。 笑死彪标,一個(gè)胖子當(dāng)著我的面吹牛倍权,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捞烟,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼薄声,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼当船!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起默辨,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤德频,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后缩幸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抱婉,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年桌粉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒸绩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铃肯,死狀恐怖患亿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情押逼,我是刑警寧澤步藕,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挑格,受9級(jí)特大地震影響咙冗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漂彤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一雾消、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挫望,春花似錦立润、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蛉幸,卻和暖如春破讨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奕纫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工提陶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人若锁。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓搁骑,卻偏偏與公主長(zhǎng)得像斧吐,于是被迫代替她去往敵國(guó)和親仲器。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仰冠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Java集合類(lèi)可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,942評(píng)論 0 13
  • 一蔚晨、集合入門(mén)總結(jié) 集合框架: Java中的集合框架大類(lèi)可分為Collection和Map;兩者的區(qū)別: 1铭腕、Col...
    程序員歐陽(yáng)閱讀 11,562評(píng)論 2 61
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 875評(píng)論 0 1
  • 3.3 集合 一方面, 面向?qū)ο笳Z(yǔ)言對(duì)事物的體現(xiàn)都是以對(duì)象的形式夹孔,為了方便對(duì)多個(gè)對(duì)象的操作搭伤,就要對(duì)對(duì)象進(jìn)行存儲(chǔ)。另...
    閆子揚(yáng)閱讀 728評(píng)論 0 1
  • 這件事情尝盼,說(shuō)起來(lái)是十分平淡的盾沫。也問(wèn)過(guò)好幾個(gè)朋友殿漠,問(wèn)他們有沒(méi)有同樣的經(jīng)驗(yàn),多半答說(shuō)有的蕾哟,而結(jié)果卻都相當(dāng)輝煌谭确,大半沒(méi)有...
    茸小呆閱讀 1,238評(píng)論 0 2