java 數(shù)據(jù)結(jié)構(gòu)(collections)

JAVA中常用的數(shù)據(jù)結(jié)構(gòu)(java.util. 中)

java中有幾種常用的數(shù)據(jù)結(jié)構(gòu)锻梳,主要分為Collection和map兩個(gè)主要接口(接口只提供方法,并不提供實(shí)現(xiàn))稿饰,而程序中最終使用的數(shù)據(jù)結(jié)構(gòu)是繼承自這些接口的數(shù)據(jù)結(jié)構(gòu)類栅葡。其主要的關(guān)系(繼承關(guān)系)有: (----詳細(xì)參見(jiàn)java api文檔!)

Collection---->Collections
Map----->SortedMap------>TreeMap
Collection---->List----->(Vector \ ArryList \ LinkedList)
Map------>HashMap
Collection---->Set------>(HashSet \ LinkedHashSet \ SortedSet)

image.png

image.png

一近忙、collection 數(shù)據(jù)結(jié)構(gòu)圖解(網(wǎng)上盜圖 抱歉

image.png

image.png

二、具體實(shí)現(xiàn)說(shuō)明

1智润、Collections

該類完全由操作集合或返回集合的靜態(tài)方法組成及舍。它包含對(duì)集合進(jìn)行操作的多態(tài)算法,“包裝器”窟绷,它返回一個(gè)由指定集合支持的新集合锯玛,以及一些其他零碎內(nèi)容。靜態(tài)類,返回的還是 collection ,相當(dāng)于工具類攘残。

2拙友、List

List是有序的Collection,使用此接口能夠精確的控制每個(gè)元素插入的位置歼郭。用戶能夠使用索引(元素在List中的位置遗契,類似于數(shù)組下 >標(biāo))來(lái)訪問(wèn)List中的元素,這類似于Java的數(shù)組病曾。

3牍蜂、Vector

基于數(shù)組(Array)的List,其實(shí)就是封裝了數(shù)組所不具備的一些功能方便我們使用泰涂,所以它難易避免數(shù)組的限制鲫竞,同時(shí)性能也不可能超越數(shù)組。所以逼蒙,在可能的情況下从绘,我們要多運(yùn)用數(shù)組。另外很重要的一點(diǎn)就是Vector是線程同步的(sychronized)的是牢,這也是Vector和ArrayList 的一個(gè)的重要區(qū)別僵井。

4、ArrayList

同Vector一樣是一個(gè)基于數(shù)組上的鏈表妖泄,但是不同的是ArrayList不是同步的驹沿。所以在性能上要比Vector好一些,但是當(dāng)運(yùn)行到多線程環(huán)境中時(shí)蹈胡,可需要自己在管理線程的同步問(wèn)題渊季。

5、LinkedList

LinkedList不同于前面兩種List罚渐,它不是基于數(shù)組的却汉,所以不受數(shù)組性能的限制。
它每一個(gè)節(jié)點(diǎn)(Node)都包含兩方面的內(nèi)容:
1.節(jié)點(diǎn)本身的數(shù)據(jù)(data)荷并;
2.下一個(gè)節(jié)點(diǎn)的信息(nextNode)合砂。
所以當(dāng)對(duì)LinkedList做添加,刪除動(dòng)作的時(shí)候就不用像基于數(shù)組的ArrayList一樣源织,必須進(jìn)行大量的數(shù)據(jù)移動(dòng)翩伪。只要更改nextNode的相關(guān)信息就可以實(shí)現(xiàn)了,這是LinkedList的優(yōu)勢(shì)谈息。

List總結(jié):

  • 所有的List中只能容納單個(gè)不同類型的對(duì)象組成的表缘屹,而不是Key-Value鍵值對(duì)。例如:[ tom,1,c ]
  • 所有的List中可以有相同的元素侠仇,例如Vector中可以有 [ tom,koo,too,koo ]
  • 所有的List中可以有null元素轻姿,例如[ tom,null,1 ]
    基于Array的List(Vector犁珠,ArrayList)適合查詢,而LinkedList 適合添加互亮,刪除操作

6犁享、Set(接口)

Set是不包含重復(fù)元素的Collection

7、HashSet

雖然Set同List都實(shí)現(xiàn)了Collection接口豹休,但是他們的實(shí)現(xiàn)方式卻大不一樣炊昆。List基本上都是以Array為基礎(chǔ)。但是Set則是在 HashMap的基礎(chǔ)上來(lái)實(shí)現(xiàn)的威根,這個(gè)就是Set和List的根本區(qū)別窑眯。HashSet的存儲(chǔ)方式是把HashMap中的Key作為Set的對(duì)應(yīng)存儲(chǔ)項(xiàng)∫搅看看 HashSet的add(Object obj)方法的實(shí)現(xiàn)就可以一目了然了。

8炊林、LinkedHashSet

HashSet的一個(gè)子類姥卢,一個(gè)鏈表。

9渣聚、SortedSet

有序的Set独榴,通過(guò)SortedMap來(lái)實(shí)現(xiàn)的。

Set總結(jié):

(1)Set實(shí)現(xiàn)的基礎(chǔ)是Map(HashMap)(2)Set中的元素是不能重復(fù)的奕枝,如果使用add(Object obj)方法添加已經(jīng)存在的對(duì)象棺榔,則會(huì)覆蓋前面的對(duì)象

-------------Map-----------------

Map 是一種把鍵對(duì)象和值對(duì)象進(jìn)行關(guān)聯(lián)的容器,而一個(gè)值對(duì)象又可以是一個(gè)Map隘道,依次類推症歇,這樣就可形成一個(gè)多級(jí)映射。對(duì)于鍵對(duì)象來(lái)說(shuō)谭梗,像Set一樣忘晤,一個(gè) Map容器中的鍵對(duì)象不允許重復(fù),這是為了保持查找結(jié)果的一致性;如果有兩個(gè)鍵對(duì)象一樣激捏,那你想得到那個(gè)鍵對(duì)象所對(duì)應(yīng)的值對(duì)象時(shí)就有問(wèn)題了设塔,可能你得到的并不是你想的那個(gè)值對(duì)象,結(jié)果會(huì)造成混亂远舅,所以鍵的唯一性很重要闰蛔,也是符合集合的性質(zhì)的。當(dāng)然在使用過(guò)程中图柏,某個(gè)鍵所對(duì)應(yīng)的值對(duì)象可能會(huì)發(fā)生變化序六,這時(shí)會(huì)按照最后一次修改的值對(duì)象與鍵對(duì)應(yīng)。對(duì)于值對(duì)象則沒(méi)有唯一性的要求爆办,你可以將任意多個(gè)鍵都映射到一個(gè)值對(duì)象上难咕,這不會(huì)發(fā)生任何問(wèn)題(不過(guò)對(duì)你的使用卻可能會(huì)造成不便,你不知道你得到的到底是那一個(gè)鍵所對(duì)應(yīng)的值對(duì)象)。

1余佃、HashMap

HashMap 和 HashSet 是 Java Collection Framework 的兩個(gè)重要成員暮刃,其中 HashMap 是 Map 接口的常用實(shí)現(xiàn)類,HashSet 是 Set 接口的常用實(shí)現(xiàn)類爆土。雖然 HashMap 和 HashSet 實(shí)現(xiàn)的接口規(guī)范不同椭懊,但它們底層的 Hash 存儲(chǔ)機(jī)制完全一樣,甚至 HashSet 本身就采用 HashMap 來(lái)實(shí)現(xiàn)的步势。

2氧猬、TreeMap

TreeMap則是對(duì)鍵按序存放,因此它便有一些擴(kuò)展的方法坏瘩,比如firstKey(),lastKey()等盅抚,你還可以從TreeMap中指定一個(gè)范圍以取得其子Map。
鍵和值的關(guān)聯(lián)很簡(jiǎn)單倔矾,用put(Object key,Object value)方法即可將一個(gè)鍵與一個(gè)值對(duì)象相關(guān)聯(lián)妄均。用get(Object key)可得到與此key對(duì)象所對(duì)應(yīng)的值對(duì)象。

------------說(shuō)明-----------

一哪自、幾個(gè)常用類的區(qū)別
1.ArrayList: 元素單個(gè)丰包,效率高,多用于查詢
2.Vector: 元素單個(gè)壤巷,線程安全邑彪,多用于查詢
3.LinkedList:元素單個(gè),多用于插入和刪除
4.HashMap: 元素成對(duì)胧华,元素可為空
5.HashTable: 元素成對(duì)寄症,線程安全,元素不可為空
二矩动、Vector瘸爽、ArrayList和LinkedList
大多數(shù)情況下,從性能上來(lái)說(shuō)ArrayList最好铅忿,但是當(dāng)集合內(nèi)的元素需要頻繁插入剪决、刪除時(shí)LinkedList會(huì)有比較好的表現(xiàn),但是它們?nèi)齻€(gè)性能都比不上數(shù)組檀训,另外Vector是線程同步的柑潦。所以:
如果能用數(shù)組的時(shí)候(元素類型固定,數(shù)組長(zhǎng)度固定)峻凫,請(qǐng)盡量使用數(shù)組來(lái)代替List渗鬼;
如果沒(méi)有頻繁的刪除插入操作,又不用考慮多線程問(wèn)題荧琼,優(yōu)先選擇ArrayList譬胎;
如果在多線程條件下使用差牛,可以考慮Vector;
如果需要頻繁地刪除插入堰乔,LinkedList就有了用武之地偏化;
如果你什么都不知道,用ArrayList沒(méi)錯(cuò)镐侯。
三侦讨、Collections和Arrays
在 Java集合類框架里有兩個(gè)類叫做Collections(注意,不是Collection9斗)和Arrays韵卤,這是JCF里面功能強(qiáng)大的工具,但初學(xué)者往往會(huì)忽視崇猫。按JCF文檔的說(shuō)法沈条,這兩個(gè)類提供了封裝器實(shí)現(xiàn)(Wrapper Implementations)、數(shù)據(jù)結(jié)構(gòu)算法和數(shù)組相關(guān)的應(yīng)用诅炉。
想必大家不會(huì)忘記上面談到的“折半查找”拍鲤、“排序”等經(jīng)典算法吧,Collections類提供了豐富的靜態(tài)方法幫助我們輕松完成這些在數(shù)據(jù)結(jié)構(gòu)課上煩人的工作:
binarySearch:折半查找汞扎。
sort:排序,這里是一種類似于快速排序的方法擅这,效率仍然是O(n * log n)澈魄,但卻是一種穩(wěn)定的排序方法。
reverse:將線性表進(jìn)行逆序操作仲翎,這個(gè)可是從前數(shù)據(jù)結(jié)構(gòu)的經(jīng)典考題哦痹扇!
rotate:以某個(gè)元素為軸心將線性表“旋轉(zhuǎn)”。
swap:交換一個(gè)線性表中兩個(gè)元素的位置溯香。
……
Collections還有一個(gè)重要功能就是“封裝器”(Wrapper)鲫构,它提供了一些方法可以把一個(gè)集合轉(zhuǎn)換成一個(gè)特殊的集合,如下:
unmodifiableXXX:轉(zhuǎn)換成只讀集合玫坛,這里XXX代表六種基本集合接口:Collection结笨、List、Map湿镀、Set炕吸、SortedMap和SortedSet。如果你對(duì)只讀集合進(jìn)行插入刪除操作勉痴,將會(huì)拋出UnsupportedOperationException異常赫模。
synchronizedXXX:轉(zhuǎn)換成同步集合。
singleton:創(chuàng)建一個(gè)僅有一個(gè)元素的集合蒸矛,這里singleton生成的是單元素Set瀑罗,
singletonList和singletonMap分別生成單元素的List和Map胸嘴。
空集:由Collections的靜態(tài)屬性EMPTY_SET、EMPTY_LIST和EMPTY_MAP表示斩祭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劣像,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子停忿,更是在濱河造成了極大的恐慌驾讲,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件席赂,死亡現(xiàn)場(chǎng)離奇詭異吮铭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)颅停,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)谓晌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人癞揉,你說(shuō)我怎么就攤上這事纸肉。” “怎么了喊熟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵柏肪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我芥牌,道長(zhǎng)烦味,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任壁拉,我火速辦了婚禮谬俄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弃理。我一直安慰自己溃论,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布痘昌。 她就那樣靜靜地躺著钥勋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辆苔。 梳的紋絲不亂的頭發(fā)上笔诵,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音姑子,去河邊找鬼乎婿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛街佑,可吹牛的內(nèi)容都是我干的谢翎。 我是一名探鬼主播捍靠,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼森逮!你這毒婦竟也來(lái)了榨婆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤褒侧,失蹤者是張志新(化名)和其女友劉穎良风,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體闷供,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烟央,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歪脏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疑俭。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖婿失,靈堂內(nèi)的尸體忽然破棺而出钞艇,到底是詐尸還是另有隱情,我是刑警寧澤豪硅,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布哩照,位于F島的核電站,受9級(jí)特大地震影響懒浮,放射性物質(zhì)發(fā)生泄漏飘弧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一嵌溢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹋岩,春花似錦赖草、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扣囊,卻和暖如春乎折,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侵歇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工骂澄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惕虑。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓坟冲,卻偏偏與公主長(zhǎng)得像磨镶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子健提,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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

  • Java集合類可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,946評(píng)論 0 13
  • 四琳猫、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列,叫字符串私痹。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 764評(píng)論 0 2
  • 第十一章 持有對(duì)象 Java實(shí)用類庫(kù)還提供了一套相當(dāng)完整的容器類來(lái)解決這個(gè)問(wèn)題脐嫂,其中基本的類型是List、Set紊遵、...
    Lisy_閱讀 804評(píng)論 0 1
  • ? 在編寫(xiě)java程序中账千,我們最常用的除了八種基本數(shù)據(jù)類型,String對(duì)象外還有一個(gè)集合類癞蚕,在我們的的程序中到處...
    Java幫幫閱讀 1,429評(píng)論 0 6
  • 前言 Java中集合大家族的成員實(shí)在是太豐富了蕊爵,有常用的ArrayList、HashMap桦山、HashSet攒射,也有不...
    AndryYu閱讀 1,438評(píng)論 0 1