在Java中有一套設(shè)計(jì)優(yōu)良的接口和類組成了Java集合框架,使程序員操作成批的數(shù)據(jù)或?qū)ο笤貥O為方便。所有的Java集合都在java.util包中。
在編寫程序的過程中,使用到集合類,要根據(jù)不同的需求,來決定使用哪種集合類,比如,要經(jīng)常遍歷集合內(nèi)元素,就要使用List,如果要保證集合中不存在重復(fù)的數(shù)據(jù),就要用Set;如果要通過某一鍵來查找某一值,就要使用Map。
1)、列表 ?List接口(繼承于Collection接口)及其實(shí)現(xiàn)類
List接口及其實(shí)現(xiàn)類是容量可變的列表,可按索引訪問集合中的元素。
特點(diǎn):集合中的元素有序、可重復(fù);
列表在數(shù)據(jù)結(jié)構(gòu)中分別表現(xiàn)為:數(shù)組和向量、鏈表、堆棧、隊(duì)列。
實(shí)現(xiàn)類:
ArrayList實(shí)現(xiàn)一個數(shù)組,它的規(guī)??勺儾⑶夷芟矜湵硪粯颖辉L問。它提供的功能類似Vector類但不同步,它是以Array方式實(shí)現(xiàn)的List,允許快速隨機(jī)存取。
LinkedList實(shí)現(xiàn)一個鏈表,提供最佳順序存取,適合插入和移除元素。由這個類定義的鏈表也可以像?;蜿?duì)列一樣被使用。提供最佳順序存取,適合插入和移除元素。
2)、集 Set接口(繼承于Collection接口)及其實(shí)現(xiàn)類
特點(diǎn):集合中的元素不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋里放東西。
對Set中成員的訪問和操作是通過Set中對象的引用進(jìn)行的,所以集中不能有重復(fù)對象。
Set也有多種變體,可以實(shí)現(xiàn)排序等功能,如TreeSet,它把對象添加到集中的操作將變?yōu)榘凑漳撤N比較規(guī)則將其插入到有序的對象序列中。
它實(shí)現(xiàn)的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。
實(shí)現(xiàn)類:
HashSet能夠快速定位一個元素,要注意的是:存入HashSet中的對象必須實(shí)現(xiàn)HashCode()方法;
TreeSet將放入其中的元素按序存放。
3)、映射 Map接口及其實(shí)現(xiàn)類
Map是一個單獨(dú)的接口,不繼承于Collection。Map是一種把鍵對象和值對象進(jìn)行關(guān)聯(lián)的容器。
特點(diǎn):key不允許重復(fù)。
映射與集或列表有明顯區(qū)別,映射中每個項(xiàng)都是成對的,Map是把鍵對象和值對象進(jìn)行關(guān)聯(lián)的容器。映射中存儲的每個對象都有一個相關(guān)的關(guān)鍵字(Key)對象,關(guān)鍵字決定了對象在映射中的存儲位置,檢索對象時必須提供相應(yīng)的關(guān)鍵字,就像在字典中查單詞一樣。關(guān)鍵字應(yīng)該是唯一的,也就是說Map中的鍵對象不允許重復(fù),這是為了保證查詢結(jié)果的一致性。
關(guān)鍵字本身并不能決定對象的存儲位置,它需要對過一種散列(hashing)技術(shù)來處理,產(chǎn)生一個被稱作散列碼(hash
code)的整數(shù)值,散列碼通常用作一個偏置量,該偏置量是相對于分配給映射的內(nèi)存區(qū)域起始位置的,由此確定關(guān)鍵字/對象對的存儲位置。理想情況下,散列處理應(yīng)該產(chǎn)生給定范圍內(nèi)均勻分布的值,而且每個關(guān)鍵字應(yīng)得到不同的散列碼。
實(shí)現(xiàn)類:
HashMap實(shí)現(xiàn)一個鍵到值映射的哈希表,通過鍵取得值對象,沒有順序,通過get(key)來獲取value,允許存儲空對象,而且允許鍵是空(由于鍵必須是唯一的,當(dāng)然只能有一個);
HashTable實(shí)現(xiàn)一個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實(shí)現(xiàn)hashcode()方法和equal()方法。這個類是前面java實(shí)現(xiàn)的一個繼承,并且通常能在實(shí)現(xiàn)映象的其他類中更好的使用。
當(dāng)元素的順序很重要時選用TreeMap,當(dāng)元素不必以特定的順序進(jìn)行存儲時,使用HashMap。Hashtable的使用不被推薦,因?yàn)镠ashMap提供了所有類似的功能,并且速度更快。當(dāng)你需要在多線程環(huán)境下使用時,HashMap也可以轉(zhuǎn)換為同步的。
Properties一般是把屬性文件讀入流中后,以鍵-值對的形式進(jìn)行保存,以方便讀取其中的數(shù)據(jù)。
4)、Iterator接口
Iterator接口位于java.util包中,它是一個對集合進(jìn)行迭代的迭代器。
集合容器(如:List、Set、Map等)本身提供了處理元素置入和取出的方式,但是單一選取元素的方法很受限制。所以我們要用Iterator去選取容器中的元素,它將容器轉(zhuǎn)換成一個序列。
Iterator iter=Object.iterator();
while(iter.hasNext()){???}
以下是筆者總結(jié)的一些面試中經(jīng)常會問的相關(guān)問題:
1.Collection、Set和List的區(qū)別?
Collection對象之間沒有指定的順序,允許有重復(fù)元素和多個null元素對象;它是Set和List接口的父類,是一種最通用型的集合接口;
Set各個元素對象之間沒有指定的順序,不允許有重復(fù)元素,最多允許有一個null元素對象;
List各個元素對象之間有指定的順序,允許重復(fù)元素和多個null元素對象;
2.LinkedList,ArrayList,Vector,Stack,Queue區(qū)別?NodeList區(qū)別?
1)LinkedList鏈?zhǔn)皆L問,以指針相連,適合于在鏈表中間需要頻繁進(jìn)行插入和刪除操作。
2)ArrayList類似數(shù)組的形式,按照序號存儲,隨機(jī)訪問速度非??臁?/p>
3)Vector向量按照各元素序號存儲,數(shù)組大小可以動態(tài)增長,對于大容量數(shù)據(jù)存儲效率較高。
4)Stack堆棧,先進(jìn)后出的數(shù)組。
這些類的對比與選擇:
如果涉及到堆棧隊(duì)列等操作,應(yīng)該考慮List中的stack,queue
對于需要快速插入刪除元素,應(yīng)該使用linkedlist
如果需要快速隨機(jī)訪問元素,應(yīng)該選用arraylist
如果程序在單線程環(huán)境中,選用非同步類
如果在多線程中,選用同步類vector、stack和hashtable以及其子類。
幾個面試常見問題:
ArrayList和Vector有什么區(qū)別?HashMap和HashTable有什么區(qū)別?
Vector和HashTable是線程同步的(synchronized)。性能上,ArrayList和HashMap分別比Vector和Hashtable要好。
講解java集合的體系結(jié)構(gòu)
A:List、Set、Map是這個集合體系中最主要的三個接口。
其中List和Set繼承自Collection接口。
Set不允許元素重復(fù)。HashSet和TreeSet是兩個主要的實(shí)現(xiàn)類。
List有序且允許元素重復(fù)。ArrayList、LinkedList和Vector是三個主要的實(shí)現(xiàn)類。
Map也屬于集合系統(tǒng),但和Collection接口不同。Map是key對value的映射集合,其中key列就是一個集合。key不能重復(fù),但是value可以重復(fù)。HashMap、TreeMap和Hashtable是三個主要的實(shí)現(xiàn)類。
SortedSet和SortedMap接口對元素按指定規(guī)則排序,SortedMap是對key列進(jìn)行排序
Comparable和Comparator區(qū)別
A:調(diào)用java.util.Collections.sort(List list)方法來進(jìn)行排序的時候,List內(nèi)的Object都必須實(shí)現(xiàn)了Comparable接口。
java.util.Collections.sort(List list,Comparator c),可以臨時聲明一個Comparator 來實(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即可。
簡述equals()和hashCode()
heap和stack有什么區(qū)別
1.heap是堆,stack是棧。
2.stack的空間由操作系統(tǒng)自動分配和釋放,heap的空間是手動申請和釋放的,heap常用new關(guān)鍵字來分配。
3.stack空間有限,heap的空間是很大的自由區(qū)。
若只是聲明一個對象,則先在棧內(nèi)存中為其分配地址空間,
若再new一下,實(shí)例化它,則在堆內(nèi)存中為其分配地址。
接下來看看什么是NodeList,NodeList跟arguments都不是普通的數(shù)組,他們有數(shù)組的一些基本屬性但是又不完全是數(shù)組。由字面意思來看NodeList是DOM操作(getElementsByTagName等)取出來的集合,是集合而不是普通的數(shù)組,但是他們有數(shù)組的一些屬性,例如length、下標(biāo)索 ? ? 引,但是他們也有自己的屬性,例如item,另外NodeList最大的特點(diǎn)就是時效性(live)。關(guān)于NodeList網(wǎng)上相關(guān)的資源不是很多,如果有讀者對這 ? ? ? 塊內(nèi)容比較熟悉,歡迎評論或發(fā)我郵箱1029666181@qq.com。
3.HashMap,HashTable,TreeMap,WeakHashMap的區(qū)別?ConcurrentHashMap區(qū)別?
關(guān)于HashMap,HashTable,TreeMap,上面已經(jīng)說的非常詳細(xì)了;
WeakHashMap是一種改進(jìn)的hashmap,他對key進(jìn)行弱引用,如果一個key不再被外部引用,則被gc回收; ? ? ? ? ? ? ? ? ? ? ? ??有興趣深入理解WeakHashMap的朋友可以查看這個帖ttp://mikewang.blog.51cto.com/3826268/880775;
ConcurrentHashMap是Java 5中支持高并發(fā)、高吞吐量的線程安全HashMap實(shí)現(xiàn)。允許多個修改操作并發(fā)進(jìn)行,其關(guān)鍵在于使用了鎖分離技術(shù)。 ? ? ? ? ?有興趣升入理解ConcurrentHashMap的朋友可以查看這個貼http://www.iteye.com/topic/344876。