在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年栓。