在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次冪。也就...