定义一下命题:
相等: 如果A和B相等,则A.equals(B)为true:如果A.equals(B)为true,则A和B相等;
相同:如果A和B相同,则A.hashCode() == B.hashCode(); 如果A.hashCode() == B.hashCode(); 则A和B相同
此问题的解释就会是:
如果只重写equals()方法,就会出现相等的两个对象不相同, 如果只重写hashCode()方法,就会出现相同的两个对象不相等。
案例1, 只重写equals()方法
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
/**
* 只重写{@link #equals(Object)} 方法, 变成只要名称是相同对象,则两{@code Person}相等
*
* @param other 另一个对象
* @return {@code true} : 两个两{@code Person}相等
*/
@Override
public boolean equals(Object other) {
if (this == other) return true;
if (other == null || getClass() != other.getClass()) return false;
Person person = (Person) other;
return Objects.equals(name, person.name);
}
}
public static void main(String[] args) {
String name = "张三";
Person a = new Person(name);
Person b = new Person(name);
System.out.print("Person a 的HashCode : '" + a.hashCode() + "'");
System.out.println("\tPerson b 的HashCode : '" + b.hashCode() + "'");
//只要HashCode一样,则证明两对象相同
System.out.print("Person a 和 Person b " + (a.hashCode() == b.hashCode() ? "" : "不") + "相同!");
System.out.println("\t 但 Person a 和 Person b " + (a.equals(b) ? "" : "不") + "相等!");
}
案例2, 只重写hashCode()方法
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
/**
* 只重写{@link #hashCode()}方法,相同hashCode的对象不向等
* @return hash code 值
*/
@Override
public int hashCode() {
return Objects.hash(name);
}
}
public static void main(String[] args) {
String name = "张三";
Person a = new Person(name);
Person b = new Person(name);
System.out.print("Person a 的HashCode : '" + a.hashCode() + "'");
System.out.println("\tPerson b 的HashCode : '" + b.hashCode() + "'");
//只要HashCode一样,则证明两对象相同
System.out.print("Person a 和 Person b " + (a.hashCode() == b.hashCode() ? "" : "不") + "相同!");
System.out.println("\t 但 Person a 和 Person b " + (a.equals(b) ? "" : "不") + "相等!");
}
那么重写hashCode()
方法,是不是也需要重写equals()
?,如果是那么可不可以说明相等hash code的对象也相等?,据我所知,好像并没有这个要求。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。