數(shù)據(jù)結(jié)構(gòu)中有數(shù)組和鏈表來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的存儲(chǔ),但是數(shù)組存儲(chǔ)區(qū)間是連續(xù)的,尋址容易,插入和刪除困難;而鏈表的空間是離散的,因此尋址困難,插入和刪除容易。

因此,綜合了二者的優(yōu)勢(shì),我們可以設(shè)計(jì)一種數(shù)據(jù)結(jié)構(gòu)——哈希表(hash table),它尋址、插入和刪除都很方便。在java中,哈希表的實(shí)現(xiàn)主要就是HashMap了,可以說(shuō)HashMap是java開(kāi)發(fā)中使用最多的類之一吧。

 

HashMap的底層其實(shí)就是鏈表的數(shù)組,代碼為

transient Entry[] table;

這里的table其實(shí)就是一個(gè)鏈表的數(shù)組,因?yàn)槲覀兊臄?shù)據(jù)是二元的,因此HashMap定義了一個(gè)內(nèi)部的類Entry,它包含了key和value兩個(gè)屬性。這樣一個(gè)一維的線性數(shù)組就可以存儲(chǔ)兩個(gè)值了。同時(shí)Entry是一個(gè)鏈表,因此還有一個(gè)Entry next屬性,它指向了下一個(gè)節(jié)點(diǎn)。

 

存儲(chǔ)put時(shí):

首先計(jì)算出key的hash,然后用table[hash]得到那個(gè)鏈表,再遍歷這個(gè)鏈表,如果鏈表中有一個(gè)key和這個(gè)key是滿足equals的話,則將value替換掉;如果沒(méi)有的話,則插入到鏈表的尾部。

int h = hash(key);
Entry e = table[h];

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式