[轉(zhuǎn)]Java集合詳解

在Java中有一套設(shè)計(jì)優(yōu)良的接口和類(lèi)組成了Java集合框架,使程序員操作成批的數(shù)據(jù)或?qū)ο笤貥O為方便。所有的Java集合都在java.util包中。

在編寫(xiě)程序的過(guò)程中,使用到集合類(lèi)方淤,要根據(jù)不同的需求,來(lái)決定使用哪種集合類(lèi)蹄殃,比如携茂,要經(jīng)常遍歷集合內(nèi)元素,就要使用List诅岩,如果要保證集合中不存在重復(fù)的數(shù)據(jù)讳苦,就要用Set;如果要通過(guò)某一鍵來(lái)查找某一值,就要使用Map吩谦。

1)鸳谜、列表 ?List接口(繼承于Collection接口)及其實(shí)現(xiàn)類(lèi)

List接口及其實(shí)現(xiàn)類(lèi)是容量可變的列表,可按索引訪問(wèn)集合中的元素式廷。

特點(diǎn):集合中的元素有序咐扭、可重復(fù)

列表在數(shù)據(jù)結(jié)構(gòu)中分別表現(xiàn)為:數(shù)組和向量滑废、鏈表蝗肪、堆棧、隊(duì)列蠕趁。

實(shí)現(xiàn)類(lèi):

ArrayList實(shí)現(xiàn)一個(gè)數(shù)組薛闪,它的規(guī)模可變并且能像鏈表一樣被訪問(wèn)俺陋。它提供的功能類(lèi)似Vector類(lèi)但不同步豁延,它是以Array方式實(shí)現(xiàn)的List,允許快速隨機(jī)存取腊状。

LinkedList實(shí)現(xiàn)一個(gè)鏈表诱咏,提供最佳順序存取,適合插入和移除元素寿酌。由這個(gè)類(lèi)定義的鏈表也可以像椧人眨或隊(duì)列一樣被使用硕蛹。提供最佳順序存取醇疼,合插入和移除元素硕并。

2)、集 Set接口(繼承于Collection接口)及其實(shí)現(xiàn)類(lèi)

特點(diǎn):集合中的元素不按特定方式排序秧荆,只是簡(jiǎn)單的把對(duì)象加入集合中倔毙,就像往口袋里放東西。

對(duì)Set中成員的訪問(wèn)和操作是通過(guò)Set中對(duì)象的引用進(jìn)行的乙濒,所以集中不能有重復(fù)對(duì)象陕赃。

Set也有多種變體,可以實(shí)現(xiàn)排序等功能颁股,如TreeSet么库,它把對(duì)象添加到集中的操作將變?yōu)榘凑漳撤N比較規(guī)則將其插入到有序的對(duì)象序列中。

它實(shí)現(xiàn)的是SortedSet接口甘有,也就是加入了對(duì)象比較的方法诉儒。通過(guò)對(duì)集中的對(duì)象迭代,我們可以得到一個(gè)升序的對(duì)象集合亏掀。

實(shí)現(xiàn)類(lèi):

HashSet能夠快速定位一個(gè)元素忱反,要注意的是:存入HashSet中的對(duì)象必須實(shí)現(xiàn)HashCode()方法

TreeSet將放入其中的元素按序存放滤愕。

3)温算、映射 Map接口及其實(shí)現(xiàn)類(lèi)

Map是一個(gè)單獨(dú)的接口,不繼承于Collection间影。Map是一種把鍵對(duì)象和值對(duì)象進(jìn)行關(guān)聯(lián)的容器注竿。

特點(diǎn):key不允許重復(fù)

映射與集或列表有明顯區(qū)別宇智,映射中每個(gè)項(xiàng)都是成對(duì)的蔓搞,Map是把鍵對(duì)象和值對(duì)象進(jìn)行關(guān)聯(lián)的容器。映射中存儲(chǔ)的每個(gè)對(duì)象都有一個(gè)相關(guān)的關(guān)鍵字(Key)對(duì)象随橘,關(guān)鍵字決定了對(duì)象在映射中的存儲(chǔ)位置喂分,檢索對(duì)象時(shí)必須提供相應(yīng)的關(guān)鍵字,就像在字典中查單詞一樣机蔗。關(guān)鍵字應(yīng)該是唯一的蒲祈,也就是說(shuō)Map中的鍵對(duì)象不允許重復(fù),這是為了保證查詢(xún)結(jié)果的一致性萝嘁。

關(guān)鍵字本身并不能決定對(duì)象的存儲(chǔ)位置梆掸,它需要對(duì)過(guò)一種散列(hashing)技術(shù)來(lái)處理,產(chǎn)生一個(gè)被稱(chēng)作散列碼(hash

code)的整數(shù)值牙言,散列碼通常用作一個(gè)偏置量酸钦,該偏置量是相對(duì)于分配給映射的內(nèi)存區(qū)域起始位置的,由此確定關(guān)鍵字/對(duì)象對(duì)的存儲(chǔ)位置咱枉。理想情況下卑硫,散列處理應(yīng)該產(chǎn)生給定范圍內(nèi)均勻分布的值徒恋,而且每個(gè)關(guān)鍵字應(yīng)得到不同的散列碼。

實(shí)現(xiàn)類(lèi):

HashMap實(shí)現(xiàn)一個(gè)鍵到值映射的哈希表欢伏,通過(guò)鍵取得值對(duì)象入挣,沒(méi)有順序,通過(guò)get(key)來(lái)獲取value硝拧,允許存儲(chǔ)空對(duì)象径筏,而且允許鍵是空(由于鍵必須是唯一的,當(dāng)然只能有一個(gè))障陶;

HashTable實(shí)現(xiàn)一個(gè)映象滋恬,所有的鍵必須非空。為了能高效的工作抱究,定義鍵的類(lèi)必須實(shí)現(xiàn)hashcode()方法和equal()方法夷恍。這個(gè)類(lèi)是前面java實(shí)現(xiàn)的一個(gè)繼承,并且通常能在實(shí)現(xiàn)映象的其他類(lèi)中更好的使用媳维。

當(dāng)元素的順序很重要時(shí)選用TreeMap酿雪,當(dāng)元素不必以特定的順序進(jìn)行存儲(chǔ)時(shí),使用HashMap侄刽。Hashtable的使用不被推薦指黎,因?yàn)镠ashMap提供了所有類(lèi)似的功能,并且速度更快州丹。當(dāng)你需要在多線程環(huán)境下使用時(shí)醋安,HashMap也可以轉(zhuǎn)換為同步的。

Properties一般是把屬性文件讀入流中后墓毒,以鍵-值對(duì)的形式進(jìn)行保存吓揪,以方便讀取其中的數(shù)據(jù)。

4)所计、Iterator接口

Iterator接口位于java.util包中柠辞,它是一個(gè)對(duì)集合進(jìn)行迭代的迭代器。

集合容器(如:List主胧、Set叭首、Map等)本身提供了處理元素置入和取出的方式,但是單一選取元素的方法很受限制踪栋。所以我們要用Iterator去選取容器中的元素焙格,它將容器轉(zhuǎn)換成一個(gè)序列。

Iterator iter=Object.iterator();

while(iter.hasNext()){???}

以下是筆者總結(jié)的一些面試中經(jīng)常會(huì)問(wèn)的相關(guān)問(wèn)題:

1.Collection夷都、Set和List的區(qū)別眷唉?

Collection對(duì)象之間沒(méi)有指定的順序,允許有重復(fù)元素和多個(gè)null元素對(duì)象;它是Set和List接口的父類(lèi)冬阳,是一種最通用型的集合接口;

Set各個(gè)元素對(duì)象之間沒(méi)有指定的順序荣瑟,不允許有重復(fù)元素,最多允許有一個(gè)null元素對(duì)象摩泪;

List各個(gè)元素對(duì)象之間有指定的順序,允許重復(fù)元素和多個(gè)null元素對(duì)象劫谅;

2.LinkedList见坑,ArrayList,Vector捏检,Stack荞驴,Queue區(qū)別?NodeList區(qū)別贯城?

1)LinkedList鏈?zhǔn)皆L問(wèn)熊楼,以指針相連,適合于在鏈表中間需要頻繁進(jìn)行插入和刪除操作能犯。

2)ArrayList類(lèi)似數(shù)組的形式鲫骗,按照序號(hào)存儲(chǔ),隨機(jī)訪問(wèn)速度非巢染В快执泰。

3)Vector向量按照各元素序號(hào)存儲(chǔ),數(shù)組大小可以動(dòng)態(tài)增長(zhǎng)渡蜻,對(duì)于大容量數(shù)據(jù)存儲(chǔ)效率較高术吝。

4)Stack堆棧,先進(jìn)后出的數(shù)組茸苇。

這些類(lèi)的對(duì)比與選擇:

如果涉及到堆棧隊(duì)列等操作排苍,應(yīng)該考慮List中的stack,queue

對(duì)于需要快速插入刪除元素学密,應(yīng)該使用linkedlist

如果需要快速隨機(jī)訪問(wèn)元素淘衙,應(yīng)該選用arraylist

如果程序在單線程環(huán)境中,選用非同步類(lèi)

如果在多線程中腻暮,選用同步類(lèi)vector腌乡、stack和hashtable以及其子類(lèi)。

幾個(gè)面試常見(jiàn)問(wèn)題:

ArrayList和Vector有什么區(qū)別膛腐?HashMap和HashTable有什么區(qū)別张咳?

Vector和HashTable是線程同步的(synchronized)。性能上款青,ArrayList和HashMap分別比Vector和Hashtable要好做修。

講解java集合的體系結(jié)構(gòu)

A:List、Set、Map是這個(gè)集合體系中最主要的三個(gè)接口饰及。

其中List和Set繼承自Collection接口蔗坯。

Set不允許元素重復(fù)。HashSet和TreeSet是兩個(gè)主要的實(shí)現(xiàn)類(lèi)燎含。

List有序且允許元素重復(fù)宾濒。ArrayList、LinkedList和Vector是三個(gè)主要的實(shí)現(xiàn)類(lèi)屏箍。

Map也屬于集合系統(tǒng)绘梦,但和Collection接口不同。Map是key對(duì)value的映射集合赴魁,其中key列就是一個(gè)集合卸奉。key不能重復(fù),但是value可以重復(fù)颖御。HashMap榄棵、TreeMap和Hashtable是三個(gè)主要的實(shí)現(xiàn)類(lèi)。

SortedSet和SortedMap接口對(duì)元素按指定規(guī)則排序潘拱,SortedMap是對(duì)key列進(jìn)行排序

Comparable和Comparator區(qū)別

A:調(diào)用java.util.Collections.sort(List list)方法來(lái)進(jìn)行排序的時(shí)候疹鳄,List內(nèi)的Object都必須實(shí)現(xiàn)了Comparable接口。


java.util.Collections.sort(List list芦岂,Comparator c)尚辑,可以臨時(shí)聲明一個(gè)Comparator 來(lái)實(shí)現(xiàn)排序。

Collections.sort(imageList, new Comparator() {

public int compare(Object a, Object b) {

int orderA = Integer.parseInt( ( (Image) a).getSequence());

int orderB = Integer.parseInt( ( (Image) b).getSequence());

return orderA - orderB;

}

});



如果需要改變排列順序

改成return orderb - orderA即可盔腔。

簡(jiǎn)述equals()和hashCode()

heap和stack有什么區(qū)別

1.heap是堆杠茬,stack是棧。

2.stack的空間由操作系統(tǒng)自動(dòng)分配和釋放弛随,heap的空間是手動(dòng)申請(qǐng)和釋放的瓢喉,heap常用new關(guān)鍵字來(lái)分配。

3.stack空間有限舀透,heap的空間是很大的自由區(qū)栓票。

若只是聲明一個(gè)對(duì)象,則先在棧內(nèi)存中為其分配地址空間愕够,

若再new一下走贪,實(shí)例化它,則在堆內(nèi)存中為其分配地址惑芭。

接下來(lái)看看什么是NodeList坠狡,NodeList跟arguments都不是普通的數(shù)組,他們有數(shù)組的一些基本屬性但是又不完全是數(shù)組遂跟。由字面意思來(lái)看NodeList是DOM操作(getElementsByTagName等)取出來(lái)的集合逃沿,是集合而不是普通的數(shù)組婴渡,但是他們有數(shù)組的一些屬性,例如length凯亮、下標(biāo)索 ? ? 引边臼,但是他們也有自己的屬性,例如item假消,另外NodeList最大的特點(diǎn)就是時(shí)效性(live)柠并。關(guān)于NodeList網(wǎng)上相關(guān)的資源不是很多,如果有讀者對(duì)這 ? ? ? 塊內(nèi)容比較熟悉富拗,歡迎評(píng)論或發(fā)我郵箱1029666181@qq.com臼予。

3.HashMap,HashTable媒峡,TreeMap,WeakHashMap的區(qū)別葵擎?ConcurrentHashMap區(qū)別谅阿?

關(guān)于HashMap,HashTable酬滤,TreeMap签餐,上面已經(jīng)說(shuō)的非常詳細(xì)了;

WeakHashMap是一種改進(jìn)的hashmap盯串,他對(duì)key進(jìn)行弱引用氯檐,如果一個(gè)key不再被外部引用,則被gc回收体捏; ? ? ? ? ? ? ? ? ? ? ? ??有興趣深入理解WeakHashMap的朋友可以查看這個(gè)帖ttp://mikewang.blog.51cto.com/3826268/880775冠摄;

ConcurrentHashMap是Java 5中支持高并發(fā)、高吞吐量的線程安全HashMap實(shí)現(xiàn)几缭。允許多個(gè)修改操作并發(fā)進(jìn)行河泳,其關(guān)鍵在于使用了鎖分離技術(shù)。 ? ? ? ? ?有興趣升入理解ConcurrentHashMap的朋友可以查看這個(gè)貼http://www.iteye.com/topic/344876年栓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拆挥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子某抓,更是在濱河造成了極大的恐慌纸兔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件否副,死亡現(xiàn)場(chǎng)離奇詭異汉矿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)备禀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)负甸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)流强,“玉大人,你說(shuō)我怎么就攤上這事呻待〈蛟拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蚕捉,是天一觀的道長(zhǎng)奏篙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)迫淹,這世上最難降的妖魔是什么秘通? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮敛熬,結(jié)果婚禮上肺稀,老公的妹妹穿的比我還像新娘。我一直安慰自己应民,他們只是感情好话原,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著诲锹,像睡著了一般繁仁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上归园,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天黄虱,我揣著相機(jī)與錄音,去河邊找鬼庸诱。 笑死捻浦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桥爽。 我是一名探鬼主播默勾,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼聚谁!你這毒婦竟也來(lái)了母剥?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤形导,失蹤者是張志新(化名)和其女友劉穎环疼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體朵耕,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炫隶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阎曹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伪阶。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡煞檩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栅贴,到底是詐尸還是另有隱情斟湃,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布檐薯,位于F島的核電站凝赛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坛缕。R本人自食惡果不足惜墓猎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赚楚。 院中可真熱鬧毙沾,春花似錦、人聲如沸宠页。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勇皇。三九已至罩句,卻和暖如春焚刺,著一層夾襖步出監(jiān)牢的瞬間敛摘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工乳愉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兄淫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓蔓姚,卻偏偏與公主長(zhǎng)得像捕虽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坡脐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法泄私,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法备闲,繼承相關(guān)的語(yǔ)法晌端,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,631評(píng)論 18 399
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 875評(píng)論 0 1
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等恬砂,對(duì)于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,497評(píng)論 0 3
  • http://www.cnblogs.com/jasonHome/p/5969574.html 結(jié)合框架體系應(yīng)該最...
    shhdjjj閱讀 1,208評(píng)論 0 0
  • 文/郴小潔 -1- 在堂哥的婚禮上泻骤,我一直偷偷地在抹眼淚漆羔。不是未婚女青年恨嫁的淚水梧奢,而是終于明白愛(ài)情不是剛剛好包裝...
    郴潔閱讀 3,105評(píng)論 26 46