將一個(gè)Set集合擴(kuò)展成了Map集合,由于這個(gè)Set采用了HashSet作為實(shí)現(xiàn)類,HashSet會(huì)使用Hash算法來保存集合中每個(gè)SimpleEntry元素,因此擴(kuò)展出來的Map本質(zhì)上是一個(gè)HashMap。 實(shí)際上,HashSet和HashMap之間有很多相似之處。
在看Set和Map之間的關(guān)系之前,先來看看Set集合的繼承體系,如圖3.1所示。
再來看Map集合的類繼承體系,如圖3.2所示。
仔細(xì)觀察圖3.2中Map集合的繼承體系里被灰色覆蓋的區(qū)域,可以發(fā)現(xiàn),這些Map接口、實(shí)現(xiàn)類和Set集合的接 口、實(shí)現(xiàn)類的類名完全相似,把Map后綴改為Set后綴即可。Set集合和Map集合的對(duì)應(yīng)關(guān)系如下。 ■ Set <-> Map ■ EnumSet <-> EnumMap ■ SortedSet <-> SortedMap ■ TreeSet <-> TreeMap ■ NavigableSet <-> NavigableMap ■ HashSet <-> HashMap ■ LinkedHashSet <-> LinkedHashMap 這些接口和類名如此相似偶然現(xiàn)象,肯定有其必然的原因。
Set< k > keySet() 由此可見,Map集合的所有key將具有Set集合的特征,只要把Map的所有key集中起來看,那它就是一個(gè)Set,這實(shí)現(xiàn)了從Map到Set的轉(zhuǎn)換。其實(shí),還可以實(shí)現(xiàn)從Set到Map的擴(kuò)展 對(duì)于Map而言,相當(dāng)于每個(gè)元素都是key-value對(duì)的Set集合。
對(duì)于HashSet而言,系統(tǒng)采用Hash算法決定集合元素的存 儲(chǔ)位置,這樣可以保證快速存、取集合元素;對(duì)于HashMap而言,系統(tǒng)將value當(dāng)成key的附屬,系統(tǒng)裉據(jù)Hash算法來決 定key的存儲(chǔ)位置,這樣可以保證快速存、取集合key ,而value總是緊隨key存儲(chǔ)。
在介紹集合存儲(chǔ)之前需要指出一點(diǎn):雖然集合號(hào)稱存儲(chǔ)的是java對(duì)象,但實(shí)際上并不會(huì)真正將Java對(duì)象放入Set集 合中,而只是在Set集合中保留這些對(duì)象的弓|用而已。也就是說,Java集合實(shí)際上是多個(gè)引用變量所組成的集合,這些引用 變量指向?qū)嶋H的java對(duì)象。
上面程序先創(chuàng)建2個(gè)Apple對(duì)象,其中t1指向第1個(gè)Apple對(duì)象,t2指向第2個(gè)Apple對(duì)象。此時(shí)系統(tǒng)內(nèi)存的分配如 圖3.6所示。
接下來,程序創(chuàng)建了一個(gè)List集合,并定義了一個(gè)list變量指向該List集合。因此,程序創(chuàng)建的實(shí)際上是一個(gè)初始 長(zhǎng)度為4的ArrayList ,也就是說這個(gè)List集合的底層長(zhǎng)度為4。
提示 ArrayList底層是基于數(shù)組實(shí)現(xiàn)的,也就是說ArrayList底層封裝的是數(shù)組,每次創(chuàng)建ArrayList時(shí)傳入的int參數(shù)就 i是它所包裝的數(shù)組的長(zhǎng)度;如果創(chuàng)建ArrayList時(shí)沒有傳入int參數(shù),那么ArrayList的初始長(zhǎng)度為10 ,也就是它底層所封裝 i的數(shù)組的長(zhǎng)度為10。
程序創(chuàng)建了一個(gè)初始長(zhǎng)度為4的ArrayList之后,接著開始嘗i式將Java對(duì)象放入ArrayList中。這與把Java對(duì)象放入 數(shù)組中是完全相同的效果:系統(tǒng)不會(huì)真正把Java對(duì)象放入ArrayList中,只是向ArrayList集合中存入這些Java對(duì)象的引用。 當(dāng)執(zhí)行兩條add語句之后,系統(tǒng)內(nèi)存分配如圖3.7所示。 從圖3.7可以看出,此時(shí)t1和list集合的第1個(gè)元素指向同一個(gè)Java對(duì)象,t2和list集合的第2個(gè)元素也指向同一個(gè) Java對(duì)象,因此程序在①、②兩行代碼處都輸出true。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注