栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Java中重写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()永远不会在对象位于集合中时改变。确保这一点的防弹方法是使您的钥匙不可变,这还有其他好处。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425862.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号