程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> hashmap-請教HashMap源碼中的一些問題

hashmap-請教HashMap源碼中的一些問題

編輯:編程綜合問答
請教HashMap源碼中的一些問題

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個字母,沒有性能的損失,也不是必須的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved