内容简介:当对象需要根据值去比较它们是否相等时,需要我们重写equals,而它的hashCode也同时需要被重要,一般来说就是对类里所有成员变更求hashCode。一个类型Demo,有两个实例demo1和demo2,当没有直接比较它们时,它们是不相等的,因为它们的引用地址不相同。(在生成多字段的hashCode时,使用了类型的Objects.hash这个方法,它的源码如下
什么时候要重写equals
当对象需要根据值去比较它们是否相等时,需要我们重写equals,而它的hashCode也同时需要被重要,一般来说就是对类里所有成员变更求hashCode。
没有重写equals时
一个类型Demo,有两个实例demo1和demo2,当没有直接比较它们时,它们是不相等的,因为它们的引用地址不相同。( 默认情况下,equals和==是一样的,比较引用类型的内存地址
)
需要根据值比较相等时要重写它们
class Demo { private String name; private String email; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Demo demo = (Demo) o; return Objects.equals(name, demo.name) && Objects.equals(email, demo.email); } @Override public int hashCode() { return Objects.hash(name, email); } }
在生成多字段的hashCode时,使用了类型的Objects.hash这个方法,它的源码如下
public static int hashCode(Object a[]) { if (a == null) return 0; int result = 1; for (Object element : a) result = 31 * result + (element == null ? 0 : element.hashCode()); return result; }
使用单元测试校验结果
@Test public void hashcode() { Demo demo1 = new Demo(); demo1.setName("zzl"); Demo demo2 = new Demo(); demo2.setName("zzl"); Assert.assertEquals(demo1.getName().hashCode(), demo2.getName().hashCode()); Assert.assertEquals(demo1.hashCode(), demo2.hashCode()); }
以上所述就是小编给大家介绍的《什么时候要重写equals》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 能用js重写的都会被typescript重写
- 重写equals的详细说明
- SpringSession:请求与响应重写
- 如何重写object虚方法
- 重写Jekyll的Relate功能
- springboot~重写json序列化方式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
人人都是产品经理
苏杰 / 电子工业出版社 / 2014-9-1 / CNY 55.00
《人人都是产品经理(纪念版)》为经典畅销书《人人都是产品经理》的内容升级版本。对于大量成长起来的优秀互联网产品经理,为数不少想投身产品工作的其他岗位从业者,以及更多有志从事这一职业的学生而言,这本书曾是他们记忆深刻的启蒙读物、思想基石和行动手册。作者以分享经历与体会为出发点,以“朋友间聊聊如何做产品”的语气,将自己数年产品工作过程中学到的思维方法与做事方式,及其它们对自己的帮助,系统性地梳理为用户......一起来看看 《人人都是产品经理》 这本书的介绍吧!