contains()的Collection框架不使用hashcode,而是使用equals(),为什么?

时间:2016-07-27 07:16:12

标签: java collections

我正在检查Collection的contains()方法的代码,但找不到hashcode()用法。以下是contains() method javadoc

的链接

3 个答案:

答案 0 :(得分:1)

  

为什么没有对ArrayList或LinkedList实现进行优化?

因为它不一定是优化。

如果hashCode明显比equals便宜,那么在hashCode之前调用equals只是一种优化。如果您知道对象的hashCode实现缓存了哈希代码值并且您之前在对象上调用了hashCode,则可以更快到达首先致电hashCode。但如果其中任何一个不成立,那么你很可能会发现:

  • hashCode来电至少与equals来电一样昂贵(毕竟,hashCode无法"短路"就像实施良好{{1}经常可以)和
  • 当哈希码值相等时,您仍需要调用equals

分析变得非常复杂......但是在很多情况下(使用equals考虑所有哈希码和等号的实现,相等与不等元素的分布等)就足够了-optimization。

话虽如此,如果你有一个用例,可以改进使用hashCode作为优化的东西,你可以自由地实现自己的自定义集合类。或者更好的是,优化元素类hashCodeequals方法,以便hashCode本身检查(缓存的)哈希值。

答案 1 :(得分:0)

哈希码只是优化。最终,Collection#containsMap#get调用必须调用equals来检查传递的对象是否确实存在,而不是另一个碰巧具有相同哈希码的对象。如果您查看HashSetHashMap等具体实施,您会看到hashCode()在整个过程中被用作优化。

答案 2 :(得分:0)

ArrayList不需要使用 hashCode()方法的原因,因为排序是由插入顺序决定的。 hashCode()方法适用于 HashSet 中的对象或用作 HashMap 中的键的对象。