面試官:Java的容器類你有什么了解嗎?
-:額轰传,沒(méi)有用過(guò)....
面試官:你肯定用過(guò)踱阿,但你沒(méi)有注意過(guò)....
-:應(yīng)該是吧....
你知道什么是容器類嗎?Java容器可以說(shuō)是增強(qiáng)程序員編程能力的基本工具榜晦,本文將與您一起理解容器類,看完之后你也許會(huì)恍然大悟琐凭,這原來(lái)就是容器類啊芽隆,一起避免面試時(shí)的尷尬!M城E哂酢!
1.容器的用途
如果對(duì)象的數(shù)量與生命周期都是固定的愁憔,自然我們也就不需要很復(fù)雜的數(shù)據(jù)結(jié)構(gòu)腕扶。
我們可以通過(guò)創(chuàng)建引用來(lái)持有對(duì)象,如
Class clazz;
也可以通過(guò)數(shù)組來(lái)持有多個(gè)對(duì)象吨掌,如
Class[] clazs = new Class[10];
然而半抱,一般情況下,我們并不知道要?jiǎng)?chuàng)建多少對(duì)象膜宋,或者以何種方式創(chuàng)建對(duì)象窿侈。數(shù)組顯然只能創(chuàng)建固定長(zhǎng)度的對(duì)象,為了使程序變得更加靈活與高效秋茫,Java類庫(kù)提供了一套完整的容器類史简,具備完善的方法來(lái)解決上述問(wèn)題。
2.容器的類別
]
觀察上圖肛著,我們可以得出容器主要分為兩種類型圆兵,兩個(gè)接口Collection與Map定義了兩類不同的對(duì)象存儲(chǔ)方式。
Collection用以保存單一的元素枢贿,Map保存關(guān)聯(lián)鍵值對(duì)殉农。通過(guò)泛型來(lái)指定容器存放的數(shù)據(jù)類型。** Iterator 設(shè)計(jì)的目的是在未知容器具體的類型的情況下局荚,用來(lái)遍歷容器元素超凳。剩下的容器類型都是繼承了這兩個(gè)接口。
在實(shí)際編碼中耀态,通過(guò)向上轉(zhuǎn)型**為接口轮傍,在其與代碼中都使用這個(gè)接口是非常普遍的使用方式。如下:
import java.util.*;
public class TestCollection {
public static void main(String[] args){
Collection<Integer> c = new ArrayList<Integer>();
for(int i = 0; i < 10; i++){
c.add(i);
}
for(Integer i : c){
System.out.print(i + ", ");
}
}
}
注:由于List接口的方法比Collection更為豐富茫陆,所以 實(shí)際應(yīng)用中金麸,ArrayList向上轉(zhuǎn)型為L(zhǎng)ist更為合適擎析。
剛剛接觸容器的朋友們可能會(huì)只把Collection與Map當(dāng)做接口簿盅,實(shí)際上并非如此挥下,容器中的接口其實(shí)有六個(gè)。
3. 容器中的七大接口
1.Collection接口
2.Map接口
3.Set接口
4.List接口
5.Queue接口
6.Iterator接口
7.Comparable接口
其中List, Queue和Set接口繼承了Collection接口桨醋,剩下的接口之間都是相互獨(dú)立的棚瘟,無(wú)繼承關(guān)系。List和Set接口主要是為了區(qū)分是否要包含重復(fù)元素喜最,Iterater迭代器則是為了更靈活的迭代集合偎蘸,與foreach一起使用。Comparable接口則用于比較瞬内。
4. 各類容器的功能(主要實(shí)現(xiàn)類分析)
-
.Collection接口
-
List接口(相比Collection, 添加了新的方法)
-
ArrayList
實(shí)現(xiàn)List接口迷雪,類似于動(dòng)態(tài)數(shù)組,適用于大量隨機(jī)訪問(wèn)的情況虫蝶。但插入和刪除的代價(jià)非常高昂 -
LinkedList
實(shí)現(xiàn)List接口章咧,類似于鏈表,也提供了優(yōu)化的順序訪問(wèn)能真。在插入和刪除方面代價(jià)低廉赁严,隨機(jī)訪問(wèn)代價(jià)較高
-
ArrayList
Set接口(方法與Collection完全相同)
HashSet
HashSet使用了散列函數(shù)實(shí)現(xiàn),極大的提高了訪問(wèn)速度粉铐,集合中的對(duì)象是沒(méi)有順序的疼约。存入HashSet的對(duì)象必須定義hashCode()TreeSet
TreeSet使用紅黑樹來(lái)實(shí)現(xiàn)存儲(chǔ)元素, 紅黑樹的好處是可以插入之后維持集合的有序性蝙泼,從而保證在遍歷的時(shí)候程剥,按照遞增的順序獲取對(duì)象。LinkedHashSet
顧名思義踱承,LinkedHashSet使用了鏈表來(lái)保持插入順序倡缠,不過(guò)為了提高查詢效率,也使用了散列茎活。-
Queue接口
-
LinkedList
LinkedList實(shí)現(xiàn)了Queue接口昙沦,提供了方法支持隊(duì)列的行為,在以后的系列我們會(huì)深入講解如何用LinkedList實(shí)現(xiàn)隊(duì)列载荔。 -
PriorityQueue
與普通隊(duì)列不同盾饮,優(yōu)先隊(duì)列每次彈出的是優(yōu)先級(jí)最高的元素±廖酰可以通過(guò)提供自己的Comparator來(lái)修改默認(rèn)的優(yōu)先級(jí)順序丘损。
-
LinkedList
-
-
Map接口
-
HashMap
HashMap通過(guò)散列機(jī)制,用來(lái)快速訪問(wèn)工扎,適用于添加徘钥、刪除和定位映射關(guān)系。允許鍵對(duì)象為null肢娘,但因?yàn)殒I對(duì)象是唯一的呈础,所以只允許有一個(gè)null舆驶。 -
TreeMap
TreeMap保持"key"處于排序狀態(tài),不允許鍵值為null而钞,訪問(wèn)速度不如HashMap -
LinkedHashMap 沙廉。
LinkedHashMap保持元素插入時(shí)順序,同時(shí)提供散列實(shí)現(xiàn)快速訪問(wèn) 臼节。
關(guān)于Map的散列實(shí)現(xiàn)是非常重要的撬陵,實(shí)現(xiàn)Map的原理(關(guān)聯(lián)數(shù)組等)。
-
HashMap
import java.util.*;
public class IntegerSet{
private static Random rand;
public static void main(String[] args){
rand = new Random(47);
Set<Integer> intset = new HashSet<Integer>();
for(int i = 0; i < 10000; i++){
intset.add(rand.nextInt(30));
}
System.out.println(intset);
}
}
5.總結(jié)
通過(guò)本文的回顧网缝,相信讀者對(duì)容器的用途巨税,分類,以及容器的層次結(jié)構(gòu)與一些常用容器的基本功能和用法有了較為清晰地了解粉臊。然而垢夹,想要更好的使用容器類,還必須了解每種容器具體的方法维费,源碼果元,以及線程安全的實(shí)現(xiàn),但是以上這些應(yīng)對(duì)一下面試官應(yīng)該還可以吧犀盟。