我正在检查Collection的contains()方法的代码,但找不到hashcode()用法。以下是contains() method javadoc
的链接答案 0 :(得分:1)
为什么没有对ArrayList或LinkedList实现进行优化?
因为它不一定是优化。
如果hashCode
明显比equals
便宜,那么在hashCode
之前调用equals
只是一种优化。如果您知道对象的hashCode
实现缓存了哈希代码值并且您之前在对象上调用了hashCode
,则可以更快到达首先致电hashCode
。但如果其中任何一个不成立,那么你很可能会发现:
hashCode
来电至少与equals
来电一样昂贵(毕竟,hashCode
无法"短路"就像实施良好{{1}经常可以)和equals
。分析变得非常复杂......但是在很多情况下(使用equals
考虑所有哈希码和等号的实现,相等与不等元素的分布等)就足够了-optimization。
话虽如此,如果你有一个用例,可以改进使用hashCode
作为优化的东西,你可以自由地实现自己的自定义集合类。或者更好的是,优化元素类hashCode
和equals
方法,以便hashCode
本身检查(缓存的)哈希值。
答案 1 :(得分:0)
哈希码只是优化。最终,Collection#contains
或Map#get
调用必须调用equals
来检查传递的对象是否确实存在,而不是另一个碰巧具有相同哈希码的对象。如果您查看HashSet
或HashMap
等具体实施,您会看到hashCode()
在整个过程中被用作优化。
答案 2 :(得分:0)
ArrayList不需要使用 hashCode()方法的原因,因为排序是由插入顺序决定的。 hashCode()方法适用于 HashSet 中的对象或用作 HashMap 中的键的对象。