gpt4 book ai didi

java - 在Java中重写equals和hashCode时应该考虑哪些问题?

转载 作者:行者123 更新时间:2023-12-02 06:01:35 24 4
gpt4 key购买 nike

覆盖 equals 时必须考虑哪些问题/陷阱和hashCode

最佳答案

理论(对于语言律师和数学爱好者):

equals() ( javadoc ) 必须定义一个等价关系(它必须是自反对称传递)。此外,它必须一致(如果对象没有被修改,那么它必须保持返回相同的值)。此外,o.equals(null) 必须始终返回 false。

hashCode() ( javadoc ) 也必须一致(如果对象没有根据 equals() 进行修改,它必须保持返回相同的值)。

两种方法之间的关系是:

Whenever a.equals(b), then a.hashCode() must be same as b.hashCode().

实践中:

如果您覆盖其中一个,那么您应该覆盖另一个。

使用与计算 equals() 相同的字段集来计算 hashCode()

使用优秀的帮助类EqualsBuilderHashCodeBuilder来自Apache Commons Lang图书馆。一个例子:

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时或MapHashSet , LinkedHashSet , HashMap , Hashtable ,或WeakHashMap ,确保放入集合中的关键对象的 hashCode() 在该对象位于集合中时不会改变。确保这一点的万无一失的方法是使您的 key 不可变,which has also other benefits .

关于java - 在Java中重写equals和hashCode时应该考虑哪些问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55972675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com