資源描述:
《java 集合系列之 hashmap詳細(xì)介紹(源碼解析)和使用示例》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、Java集合系列之HashMap詳細(xì)介紹(源碼解析)和使用示例概要這一章,我們對(duì)HashMap進(jìn)行學(xué)習(xí)。我們先對(duì)HashMap有個(gè)整體認(rèn)識(shí),然后再學(xué)習(xí)它的源碼,最后再通過實(shí)例來學(xué)會(huì)使用HashMap。內(nèi)容包括:第1部分HashMap介紹第2部分HashMap數(shù)據(jù)結(jié)構(gòu)第3部分HashMap源碼解析(基于JDK1.6.0_45)第3.1部分HashMap的“拉鏈法”相關(guān)內(nèi)容第3.2部分HashMap的構(gòu)造函數(shù)第3.3部分HashMap的主要對(duì)外接口第3.4部分HashMap實(shí)現(xiàn)的Cloneable接口第3
2、.5部分HashMap實(shí)現(xiàn)的Serializable接口第4部分HashMap遍歷方式第5部分HashMap示例第1部分HashMap介紹HashMap簡介HashMap是一個(gè)散列表,它存儲(chǔ)的內(nèi)容是鍵值對(duì)(key-value)映射。HashMap繼承于AbstractMap,實(shí)現(xiàn)了Map、Cloneable、java.io.Serializable接口。HashMap的實(shí)現(xiàn)不是同步的,這意味著它不是線程安全的。它的key、value都可以為null。此外,HashMap中的映射不是有序的。HashMa
3、p的實(shí)例有兩個(gè)參數(shù)影響其性能:“初始容量”和“加載因子”。容量是哈希表中桶的數(shù)量,初始容量只是哈希表在創(chuàng)建時(shí)的容量。加載因子是哈希表在其容量自動(dòng)增加之前可以達(dá)到多滿的一種尺度。當(dāng)哈希表中的條目數(shù)超出了加載因子與當(dāng)前容量的乘積時(shí),則要對(duì)該哈希表進(jìn)行rehash操作(即重建內(nèi)部數(shù)據(jù)結(jié)構(gòu)),從而哈希表將具有大約兩倍的桶數(shù)。通常,默認(rèn)加載因子是0.75,這是在時(shí)間和空間成本上尋求一種折衷。加載因子過高雖然減少了空間開銷,但同時(shí)也增加了查詢成本(在大多數(shù)HashMap類的操作中,包括get和put操作,都反映了
4、這一點(diǎn))。在設(shè)置初始容量時(shí)應(yīng)該考慮到映射中所需的條目數(shù)及其加載因子,以便最大限度地減少rehash操作次數(shù)。如果初始容量大于最大條目數(shù)除以加載因子,則不會(huì)發(fā)生rehash操作。HashMap的構(gòu)造函數(shù)HashMap共有4個(gè)構(gòu)造函數(shù),如下:復(fù)制代碼//默認(rèn)構(gòu)造函數(shù)。HashMap()//指定“容量大小”的構(gòu)造函數(shù)HashMap(intcapacity)//指定“容量大小”和“加載因子”的構(gòu)造函數(shù)HashMap(intcapacity,floatloadFactor)//包含“子Map”的構(gòu)造函數(shù)Hash
5、Map(Mapmap)復(fù)制代碼HashMap的API復(fù)制代碼voidclear()Objectclone()booleancontainsKey(Objectkey)booleancontainsValue(Objectvalue)Set>entrySet()Vget(Objectkey)booleanisEmpty()SetkeySet()Vput(Kkey,Vvalue)voidputAll(Map6、endsV>map)Vremove(Objectkey)intsize()Collectionvalues()復(fù)制代碼第2部分HashMap數(shù)據(jù)結(jié)構(gòu)HashMap的繼承關(guān)系復(fù)制代碼java.lang.Object?java.util.AbstractMap?java.util.HashMappublicclassHashMapextendsAbstractMapimplementsMap,Cloneable,Serializable{}復(fù)制代碼從
7、圖中可以看出:(01)HashMap繼承于AbstractMap類,實(shí)現(xiàn)了Map接口。Map是"key-value鍵值對(duì)"接口,AbstractMap實(shí)現(xiàn)了"鍵值對(duì)"的通用函數(shù)接口。(02)HashMap是通過"拉鏈法"實(shí)現(xiàn)的哈希表。它包括幾個(gè)重要的成員變量:table,size,threshold,loadFactor,modCount。 table是一個(gè)Entry[]數(shù)組類型,而Entry實(shí)際上就是一個(gè)單向鏈表。哈希表的"key-value鍵值對(duì)"都是存儲(chǔ)在Entry數(shù)組中的。 size是Ha
8、shMap的大小,它是HashMap保存的鍵值對(duì)的數(shù)量?! hreshold是HashMap的閾值,用于判斷是否需要調(diào)整HashMap的容量。threshold的值="容量*加載因子",當(dāng)HashMap中存儲(chǔ)數(shù)據(jù)的數(shù)量達(dá)到threshold時(shí),就需要將HashMap的容量加倍?! oadFactor就是加載因子?! odCount是用來實(shí)現(xiàn)fail-fast機(jī)制的。第3部分HashMap源碼解析(基于JDK1.6.0_45)為了更了解HashMap