什么问题/陷阱,必须重写时,必须考虑equals
和hashCode
?
理论(针对语言律师和数学倾向者):
equals()(javadoc)
必须定义一个等价关系(它必须是自反的,对称的和可传递的)。另外,它必须是一致的(如果未修改对象,则它必须保持返回相同的值)。此外,o.equals(null)
必须始终返回false
。
hashCode()(javadoc)
也必须是一致的(如果未根据修改对象equals(),则它必须保持返回相同的值)。
该关系的两种方法之间是:
每当a.equals(b),则a.hashCode()必须与相同b.hashCode()。
在实践中:
如果覆盖一个,则应覆盖另一个。
使用用于计算的相同字段集equals()
进行计算hashCode()
。
使用优秀的辅助类EqualsBuilder
和HashCodeBuilder
从阿帕奇共享郎库。一个例子:
public class Person {
private String name;
private int age;
// ...
@Override
public int hashCode() {
return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
// if deriving: appendSuper(super.hashCode()).
append(name).
append(age).
toHashCode();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
if (obj == this)
return true;
Person rhs = (Person) obj;
return new EqualsBuilder().
// if deriving: appendSuper(super.equals(obj)).
append(name, rhs.name).
append(age, rhs.age).
isEquals();
}
}
还请记住:
使用基于哈希的Collection或Map(例如HashSet,LinkedHashSet,HashMap,Hashtable或WeakHashMap)时,请确保放入对象的关键对象的hashCode()永远不会在对象位于集合中时改变。确保这一点的防弹方法是使您的钥匙不可变,这还有其他好处。
我知道(合同)当equals被重写时,我们需要重写hashcode。为什么我要考虑用于相等比较的相同字段来计算hashcode?是否通过避免太多对象映射到相同的桶来提高性能,如下面的情况?即所有在同一“日期”创建的对象都将映射到同一桶,并且线性比较将花费时间使用equals()方法检查对象是否存在? 如果我上面的说法是真的,那么除了性能问题之外,下面的代码还会出现哪些其他潜在的问题。这是我们应该使
本文向大家介绍hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?相关面试题,主要包含被问及hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?时的应答技巧和注意事项,需要的朋友参考一下 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha
问题内容: 关于如何考虑 超字段的 子类中的 Override &in,是否有特定规则?知道有很多参数:超字段是private / public,有/没有getter … 例如,Netbeans生成的equals()和hashCode()不会考虑超级字段…和 将返回true :( 如果要查看Netbeans生成的equals()和hashCode(): 问题答案: 儿童不应该检查父母的私人成员 但
本文向大家介绍java中为何重写equals时必须重写hashCode方法详解,包括了java中为何重写equals时必须重写hashCode方法详解的使用技巧和注意事项,需要的朋友参考一下 前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白。 在上一篇博文Java中e
本文向大家介绍java中重写equals()方法的同时要重写hashcode()方法(详解),包括了java中重写equals()方法的同时要重写hashcode()方法(详解)的使用技巧和注意事项,需要的朋友参考一下 object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 tr
本文向大家介绍重写hashCode()和equals()方法详细介绍,包括了重写hashCode()和equals()方法详细介绍的使用技巧和注意事项,需要的朋友参考一下 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equals()方法 如果你决定要重写