final Entry getEntry(Object key) {
// 獲取哈希值
// HashMap將“key為null”的元素存儲在table[0]位置,“key不為null”的則調用hash()計算哈希值
int hash = (key == null) ? 0 : hash(key.hashCode());
// 在“該hash值對應的鏈表”上查找“鍵值等於key”的元素
for (Entry e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (**e.hash == hash **&&
((k = e.key) == key || (key != null&& key.equals(k))))
return e;
}
return null;
}
getEntry()函數中: 為啥要判斷hash值是否相等,是因為key相等,hash值不一定相等嗎?
public boolean containsValue(Object value) {
// 若“value為null”,則調用containsNullValue()查找
if (value == null)
return containsNullValue();
// 若“value不為null”,則查找HashMap中是否有值為value的節點。
**Entry[] tab = table;**
for (int i = 0; i < tab.length ; i++)
for (Entry e = tab[i] ; e != null ; e = e.next)
if (value.equals(e.value))
return true;
return false;
}
containsValue()中:Entry[] tab = table 為什麼要創建一個新的tab引用指向原table,為什麼不對table操作呢?
請教各位~
hash的優勢就在這裡,hash相等,不一定值相等,但是hash不等,值一定不相等,基於此,先判斷hash,可以加快搜索的速度。
Entry[] tab = table; 這裡傳的是引用,只是定義了一個類型而已,沒有調用new,沒有創建新的 tab。這麼寫只是使得下面需要寫table的地方少寫3個字母,沒有性能的損失,也不是必須的。