基於 JDK1 7 版本實現 HashMap

2021-09-12 12:19:58 字數 2040 閱讀 9007

在jdk1.7中是用的「陣列+單鏈表實現的hashmap」。前一篇我用了linkedlist+陣列實現,其實本質上差不多,只是沒有寫擴容這一塊的內容,今天來個原生的方式實現hashmap。

hashmap擴容機制?

擴容後會產生什麼影響?

因為很多解釋都寫到注釋裡面了,就不分模組解釋了。?

hashmap只允許乙個為null的key。

hashmap的擴容:當前table陣列的兩倍

hashmap實際能儲存的元素個數: capacity * loadfactor

hashmap在擴容的時候,會重新計算hash值,並對hash的位置進行重新排列, 因此,為了效率,盡量給hashmap指定合適的容量,避免多次擴容.

/**

* @author 程式設計師快樂的秘密

* */

public

inte***ce

extmap

}package com.xianglei.exthashmap;

/** *

* @author 程式設計師快樂的秘密

* * @param * @param */

public

class

exthashmap

implements

extmap

// 2. hashmap 擴容機制 為什麼要擴容?擴容陣列之後,有什麼影響? hahsmap 中是從什麼時候開始擴容

// 實際儲存大小=負載因子*初始容量=default_load_factor0.75*default_initial_capacity16=12

// 如果size>12的時候就需要開始擴容陣列,擴容陣列大小之前兩倍

if(size >

(default_load_factor * default_initial_capacity)

)// 3.計算hash值指定下標位置

int index =

getindex

(key, default_initial_capacity)

; node

node = table[index];if

(node == null)

else

else

} newnode = newnode.next;}}

table[index]

= node;

return null;

}// hashmap陣列擴容機制

private

void

resize()

}}// 測試方法.列印所有的鍊錶元素

void

print()

else

} system.out.

println()

;}}public

intgetindex

(k k,

int length)

public v get

(k k)

public node

getnode

(node

node, k k)

node = node.next;

}return null;

}public

intsize()

// 定義節點

class

node

implements

entry

public k getkey()

public v getvalue()

public v setvalue

(v value)

}public

static

void

main

(string[

] args)

}

附錄:

HashMap在JDK1 7和1 8版本的區別

在jdk1.7中hashmap是以entry陣列來儲存資料。用key的hashcode取模來決定key會被放在陣列裡的位置 如果hashcode相同,或者hashcode取模結果相同 那麼這些key會被定義到entry陣列的同乙個格仔裡,這些key會形成乙個鍊錶。1.在jdk1.8中hashmap是...

Mac安裝jdk1 7版本不相容的問題

解決辦法 2 在dos中執行命令 pkgutil expand volumes jdk 7 update 60 jdk 7 update 60.pkg tmp jdk 7 update 60.unpkg 通過命令解壓pkg檔案到指定的資料夾下。3 通過finder或者dos前往jdk 7 updat...

基於JDK1 7的HashMap原始碼閱讀分析

此版本是基於jdk1.7的hashmap。hashmap的資料結構是陣列加單向鍊錶。建立hashmap時,陣列長度預設值為16,最終呼叫的構造方法如下 public hashmap int initialcapacity,float loadfactor 陣列的長度capacity為2的n次冪。也就...