首頁技術(shù)文章正文

List、Map、Set三個(gè)接口在存取元素時(shí)各有什么特點(diǎn)?

更新時(shí)間:2023-09-20 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

首先,List與Set具有相似性,它們都是單列元素的集合,所以,它們有一個(gè)功共同的父接口,叫Collection。Set里面不允許有重復(fù)的元素,所謂重復(fù),即不能有兩個(gè)相等(注意,不是僅僅是相同)的對象,即假設(shè)Set集合中有了一個(gè)A對象,現(xiàn)在我要向Set集合再存入一個(gè)B對象,但B對象與A對象equals相等,則B對象存儲(chǔ)不進(jìn)去,所以,Set集合的add方法有一個(gè)boolean的返回值,當(dāng)集合中沒有某個(gè)元素,此時(shí)add方法可成功加入該元素時(shí),則返回true,當(dāng)集合含有與某個(gè)元素equals相等的元素時(shí),此時(shí)add方法無法加入該元素,返回結(jié)果為false。Set取元素時(shí),沒法說取第幾個(gè),只能以Iterator接口取得所有的元素,再逐一遍歷各個(gè)元素。

List表示有先后順序的集合,注意,不是那種按年齡、按大小、按價(jià)格之類的排序。當(dāng)我們多次調(diào)用add(Obje)方法時(shí),每次加入的對象就像火車站買票有排隊(duì)順序一樣,按先來后到的順序排序。有時(shí)候,也可以插隊(duì),即調(diào)用add(intindex,Obje)方法,就可以指定當(dāng)前對象在集合中的存放位置。一個(gè)對象可以被反復(fù)存儲(chǔ)進(jìn)List中,每調(diào)用一次add方法,這個(gè)對象就被插入進(jìn)集合中一次,其實(shí),并不是把這個(gè)對象本身存儲(chǔ)進(jìn)了集合中,而是在集合中用一個(gè)索引變量指向這個(gè)對象,當(dāng)這個(gè)對象被add多次時(shí),即相當(dāng)于集合中有多個(gè)索引指向了這個(gè)對象,如圖x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍歷各個(gè)元素之外,還可以調(diào)用get(indexi)來明確說明取第幾個(gè)。

Map與List和Set不同,它是雙列的集合,其中有put方法,定義如下:put(objkey,objvalue),每次存儲(chǔ)時(shí),要存儲(chǔ)一對key/value,不能存儲(chǔ)重復(fù)的key,這個(gè)重復(fù)的規(guī)則也是按equals比較相等。取則可以根據(jù)key獲得相應(yīng)的value,即get(Objectkey)返回值為key所對應(yīng)的value。另外,也可以獲得所有的key的結(jié)合,還可以獲得所有的value的結(jié)合,還可以獲得key和value組合成的Map.Entry對象的集合。

List以特定次序來持有元素,可有重復(fù)元素。Set無法擁有重復(fù)元素,內(nèi)部排序。Map保存key-value值,value可多值。

HashSet按照hashcode值的某種運(yùn)算方式進(jìn)行存儲(chǔ),而不是直接按hashCode值的大小進(jìn)行存儲(chǔ)。例如,"abc"--->78,"def"--->62,"xyz"--->65在hashSet中的存儲(chǔ)順序不是62,65,78,這些問題感謝以前一個(gè)叫崔健的學(xué)員提出,最后通過查看源代碼給他解釋清楚,看本次培訓(xùn)學(xué)員當(dāng)中有多少能看懂源碼。

LinkedHashSet按插入的順序存儲(chǔ),那被存儲(chǔ)對象的hashcode方法還有什么作用呢?學(xué)員想想!hashset集合比較兩個(gè)對象是否相等,首先看hashcode方法是否相等,然后看equals方法是否相等。new兩個(gè)Student插入到HashSet中,看HashSet的size,實(shí)現(xiàn)hashcode和equals方法后再看size。

同一個(gè)對象可以在Vector中加入多次。往集合里面加元素,相當(dāng)于集合里用一根繩子連接到了目標(biāo)對象。往HashSet中卻加不了多次的。

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!