对于两个对象,Java要求如下:
equals()相等,hashcode()一定相等;
quals()不等,hashcode()可能相等,也可能不等;
hashcode()不等,一定能推出equals()也不等;
hashcode()相等,equals()可能相等,也可能不等。
而根据Java规范的约定,在集合类中需要重写这两个方法,
因为在集合中,判断两个对象是否相等的规则是:
第一步,如果hashCode()相等,则查看第二步,否则不相等;
第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等。
Java语言对equals()的要求如下,这些要求是必须遵循的:
A 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
B 反射性:x.equals(x)必须返回是“true”。
C 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
D 一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
可能看上面看得一脸懵逼,答主直接说说自己的见解吧。
hashcode和equals方法都来自Object类,
简单来说,hashcode方法重写就是为了保证相同的对象会有相同的hashcode,
而根据上面的规则,改写hashcode,就必然要写equals。
因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;
而如果需要用到自定义的类,就必然要写关于这个类的对象是否相等的equals方法。
网友评论