動手實現HashMap以便了解原理

2021-09-10 10:02:40 字數 3179 閱讀 6489

2.7 實現get方法

注資料結構中有陣列和鍊錶來實現對資料的儲存。

hashmap的頂層介面是map,那麼我們自己實現的map也需要乙個介面,在這裡我定義介面的名稱為mymap。這個介面中應該含有的方法包括:

package map;

public

inte***ce

mymap

}

介面設計完畢之後,我們需要建立乙個類來實現這個介面的方法。我建立了乙個名為myhashmap的類實現mymap介面。

這裡我們需要乙個內部類來實現mymap的內部介面,內部類的例項物件即陣列中儲存的entry物件,所以我們需要定義三個成員變數,分別是k,v和next。next的型別就是entry本身,因為它指向的是下乙個entry物件。

內部類**:

public

class

myhashmap

implements

mymap

@override

public k getkey()

@override

public v getvalue()

}}

hashmap中含有以下幾個成員變數:

//預設陣列大小,初始大小為16

private

static

int defaultlength =16;

//預設負載因子,為0.75

private

static

double defaultloader =

0.75

;//entry陣列

private entry

table = null;

//hashmap的大小

private

int size =

0;

在hashmap中預設陣列長度和預設負載因子都是可以自定義的,那麼我們定義乙個可以自定義陣列長度和負載因子的構造方法。

自定義長度和負載因子:

public

myhashmap

(int length,

double loader)

預設:

public

myhashmap()

雜湊函式我們使用除留取餘法。定義乙個整型m,m的取值應該是乙個比陣列長度小的最大質數,為了簡化演算法我取陣列的長度作為m的值。以key的雜湊值模於m,得到index的值並且返回。

本例為了方便理解簡單舉例,如果需要分布更均勻些,請自己寫。

/**

* 自定義雜湊演算法:根據key的雜湊值得到乙個index索引

* 即存放到陣列中的下標

* * @param k

* @return

*/private

intgetindex

(k k)

我們需要通過雜湊演算法得到陣列的下標,然後把乙個包含鍵值對以及next指標的entry物件存到該位置中。

@override

public v put

(k k, v v)

// 根據key和雜湊演算法算出陣列下標

int index =

getindex

(k);

system.out.

println

("下標為:"

+ index)

; entry

entry = table[index];if

("key30"

.equals

(k))

// 判斷entry是否為空

if(entry == null)

else

return table[index]

.getvalue()

;}

當陣列大小已經超過負載的時候,需要對進行擴容,擴容後還需要將原先的值重新排列,以確保值分布均勻。此處重新雜湊我們借助了集合來實現。

/**

* 陣列擴容

*/private

void

expand()

// 重新雜湊的過程

private

void

rehash

(entry

newtable)

// 通過遞迴的方式將所有的entry物件裝載到list中

findentrybynext

(table[i]

, list);}

table = newtable;

if(list.

size()

>0)

// 對新table進行雜湊

put(entry.

getkey()

, entry.

getvalue()

);}}

system.out.

println

("重新雜湊完成*****");

}private

void

findentrybynext

(entry

entry, list

> list)

else

}

get方法先去獲取雜湊值,而後再根據得到得位置來遍歷鍊錶,以確保找到key。

@override

public v get

(k k)

// 呼叫方法找到真正的value值並返回。

return

findvaluebyequalkey

(k, table[index]);

}

/**

* * 通過遞迴比較key值的方式找到真正我們要找的value值

* * @param k

* @param entry

* @return

*/private v findvaluebyequalkey

(k k, entry

entry)

else

}return entry.

getvalue()

;}

自己動手實現乙個hashmap

動手實現 redux

假如按鈕和介面不在同一元件,經常用redux去實現上面功能,可以想象到如下 const test hello world const mapstatetoprops state 用過mapstatetoprops從頂層拿到屬性然後展示,在另乙個組建通過mapdispatchtoprops去觸發act...

動手實現Tomcat

版本一 無區分靜態資源 如demo.html 一 需求描述 二 整體示意圖 三 實現 專案工程 服務端的工作都在testserver類中完成 1.服務端的準備工作 1 靜態變數web root,用於存放webcontent目錄的絕對路徑 2 定義靜態變數url,存放本次請求服務端的靜態資源的名稱 2...

hashmap實現機制

int uint key.gethashcode 0x8ffffff 具體多少忘記了,總之就是把它弄成正數 int index uint map.length 把value放到那個 index位置。下次訪問時再通過 key的hashcode 0x8fffff 再 map.length 就知道valu...