真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

HashMap的底層原理是什么-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)HashMap的底層原理是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的平塘網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

一:HashMap的節(jié)點(diǎn):HashMap是一個(gè)集合,鍵值對(duì)的集合,源碼中每個(gè)節(jié)點(diǎn)用Node表示

static class Node implements Map.Entry {   final int hash;   final K key;
   V value;
   Node next;

Node是一個(gè)內(nèi)部類(lèi),這里的key為鍵,value為值,next指向下一個(gè)元素,可以看出HashMap中的元素不是一個(gè)單純的鍵值對(duì),還包含下一個(gè)元素的引用。

二:HashMap的數(shù)據(jù)結(jié)構(gòu):HashMap的數(shù)據(jù)結(jié)構(gòu)為 數(shù)組+(鏈表或紅黑樹(shù)),上圖:

HashMap的底層原理是什么

image.png

為什么采用這種結(jié)構(gòu)來(lái)存儲(chǔ)元素呢?

數(shù)組的特點(diǎn):查詢效率高,插入,刪除效率低。

鏈表的特點(diǎn):查詢效率低,插入刪除效率高。

在HashMap底層使用數(shù)組加(鏈表或紅黑樹(shù))的結(jié)構(gòu)完美的解決了數(shù)組和鏈表的問(wèn)題,使得查詢和插入,刪除的效率都很高。

三:HashMap存儲(chǔ)元素的過(guò)程:

有這樣一段代碼:

HashMap map = new HashMap();
map.put("劉德華","張惠妹");
map.put("張學(xué)友","大S");

現(xiàn)在我要把鍵值對(duì) “劉德華”,”張惠妹”存入map:

第一步:計(jì)算出鍵“劉德華”的hashcode,該值用來(lái)定位要將這個(gè)元素存放到數(shù)組中的什么位置.

什么是hashcode?

在Object類(lèi)中有一個(gè)方法:

public native int hashCode();

該方法用native修飾,所以是一個(gè)本地方法,所謂本地方法就是非java代碼,這個(gè)代碼通常用c或c++寫(xiě)成,在java中可以去調(diào)用它。

調(diào)用這個(gè)方法會(huì)生成一個(gè)int型的整數(shù),我們叫它哈希碼,哈希碼和調(diào)用它的對(duì)象地址和內(nèi)容有關(guān).

哈希碼的特點(diǎn)是:

對(duì)于同一個(gè)對(duì)象如果沒(méi)有被修改(使用equals比較返回true)那么無(wú)論何時(shí)它的hashcode值都是相同的

對(duì)于兩個(gè)對(duì)象如果他們的equals返回false,那么他們的hashcode值也有可能相等

明白了hashcode我們?cè)賮?lái)看元素如何通過(guò)hashcode定位到要存儲(chǔ)在數(shù)組的哪里,通過(guò)hashcode值和數(shù)組長(zhǎng)度取模我們可以得到元素存儲(chǔ)的下標(biāo)。

劉德華的hashcode為20977295 數(shù)組長(zhǎng)度為 16則要存儲(chǔ)在數(shù)組索引為 20977295%16=1的地方

HashMap的底層原理是什么

1.jpg

可以分兩種情況:

1. 數(shù)組索引為1的地方是空的,這種情況很簡(jiǎn)單,直接將元素放進(jìn)去就好了。

2. 已經(jīng)有元素占據(jù)了索引為1的位置,這種情況下我們需要判斷一下該位置的元素和當(dāng)前元素是否相等,使用equals來(lái)比較。

如果使用默認(rèn)的規(guī)則是比較兩個(gè)對(duì)象的地址。也就是兩者需要是同一個(gè)對(duì)象才相等,當(dāng)然我們也可以重寫(xiě)equals方法來(lái)實(shí)現(xiàn)我們自己的比較規(guī)則最常見(jiàn)的是通過(guò)比較屬性值來(lái)判斷是否相等。

如果兩者相等則直接覆蓋,如果不等則在原元素下面使用鏈表的結(jié)構(gòu)存儲(chǔ)該元素

HashMap的底層原理是什么

2.jpg

每個(gè)元素節(jié)點(diǎn)都有一個(gè)next屬性指向下一個(gè)節(jié)點(diǎn),這里由數(shù)組結(jié)構(gòu)變成了數(shù)組+鏈表結(jié)構(gòu),紅黑樹(shù)又是怎么回事呢?

因?yàn)殒湵碇性靥嗟臅r(shí)候會(huì)影響查找效率,所以當(dāng)鏈表的元素個(gè)數(shù)達(dá)到8的時(shí)候使用鏈表存儲(chǔ)就轉(zhuǎn)變成了使用紅黑樹(shù)存儲(chǔ),原因就是紅黑樹(shù)是平衡二叉樹(shù),在查找性能方面比鏈表要高.

四:HashMap中的兩個(gè)重要的參數(shù):HashMap中有兩個(gè)重要的參數(shù):初始容量大小和加載因子,初始容量大小是創(chuàng)建時(shí)給數(shù)組分配的容量大小,默認(rèn)值為16,用數(shù)組容量大小乘以加載因子得到一個(gè)值,一旦數(shù)組中存儲(chǔ)的元素個(gè)數(shù)超過(guò)該值就會(huì)調(diào)用rehash方法將數(shù)組容量增加到原來(lái)的兩倍,專(zhuān)業(yè)術(shù)語(yǔ)叫做擴(kuò)容.

在做擴(kuò)容的時(shí)候會(huì)生成一個(gè)新的數(shù)組,原來(lái)的所有數(shù)據(jù)需要重新計(jì)算哈希碼值重新分配到新的數(shù)組,所以擴(kuò)容的操作非常消耗性能.

HashMap的底層原理是什么

關(guān)于HashMap的底層原理是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


本文題目:HashMap的底層原理是什么-創(chuàng)新互聯(lián)
瀏覽路徑:http://weahome.cn/article/csjdph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部