什么时候要重写equals
程序员文章站
2022-04-09 08:32:52
什么时候要重写equals 当对象需要根据值去比较它们是否相等时,需要我们重写equals,而它的hashCode也同时需要被重要,一般来说就是对类里所有成员变更求hashCode。 没有重写equals时 一个类型Demo,有两个实例demo1和demo2,当没有直接比较它们时,它们是不相等的,因 ......
什么时候要重写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()); }
上一篇: php中的数组操作函数整理