Java HashMap方法containsKey是否计算每次调用中传递的对象的哈希值

时间:2018-01-26 02:11:42

标签: java hashmap

boolean containsKey(Object key)类的HashMap每次调用时都会计算传递对象的哈希值吗?如果是的话,无论如何都要避免接下来的电话吗?

2 个答案:

答案 0 :(得分:7)

是的,确实如此。不,你无法避免它。

如果计算成本很高,则应更改hashCode()以缓存计算值,以便仅在第一次调用时计算。它应该是一个快速的功能。不要指望呼叫者试图避免过多地调用它。

答案 1 :(得分:4)

来自JDK6 source

351     public boolean containsKey(Object key) {
352         return getEntry(key) != null;
353     }

360     final Entry<K,V> getEntry(Object key) {
361         int hash = (key == null) ? 0 : hash(key.hashCode());
362         for (Entry<K,V> e = table[indexFor(hash, table.length)];
363              e != null;
364              e = e.next) {
365             Object k;
366             if (e.hash == hash &&
367                 ((k = e.key) == key || (key != null && key.equals(k))))
368                 return e;
369         }
370         return null;
371     }

如果key不为空,那么结论每次都