由于equals()和hashCode()方法都是Object中的,所以hashCode和equals方法都可以被重写的,如果重写了其中的一个,而没有重写另外一个,则两个对象A,B之间如果A.equals(B)==true ,那么A的hashCode和B的hashCode未必相等。
package com.jjyy.basic;
public class EqualsDemo {
public static void main(String[] args) {
EqualsTest cat = new EqualsTest("zhansan", 20);
EqualsTest dog = new EqualsTest("zhansan", 23);
System.out.println(cat.equals(dog));
System.out.println(cat.hashCode() == dog.hashCode());
}
}
class EqualsTest {
private String name;
private int age;
public EqualsTest(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
// 只要name相同也可能相同
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EqualsTest other = (EqualsTest) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
结果为:
true
false
如果重写了hashCode和equals方法,那么两者就都相等了
package com.jjyy.basic;
public class EqualsDemo {
public static void main(String[] args) {
EqualsTest cat = new EqualsTest("zhansan", 20);
EqualsTest dog = new EqualsTest("zhansan", 23);
System.out.println(cat.equals(dog));
System.out.println(cat.hashCode() == dog.hashCode());
}
}
class EqualsTest {
private String name;
private int age;
public EqualsTest(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
// 只要name相同也可能相同
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EqualsTest other = (EqualsTest) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
结果为:
true
true
所以,在重写了equals方法时,建议最好将hashCode方法也重写了。