众所周知,当equals()
被覆盖时,hashCode()
也必须被覆盖。
这是非JavaFX bean类中的典型示例。
public class Person {
private String name;
private int age;
@Override
public int hashCode() {
int result = 17;
result = 31 * result + name.hashCode();
result = 31 * result + age;
return result;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
if (obj == this)
return true;
Person rhs = (Person) obj;
return Objects.equals(name, rhs.name) &&
age == rhs.age;
}
}
JavaFX bean:
public class Person {
private StringProperty name;
private IntegerProperty age;
// Option A
@Override
public int hashCode() {
int result = 17;
result = 31 * result + name.hashCode();
result = 31 * result + age.hashCode();
return result;
}
// Option B
@Override
public int hashCode() {
int result = 17;
result = 31 * result + name.get().hashCode();
result = 31 * result + age.get().hashCode();
return result;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
if (obj == this)
return true;
Person rhs = (Person) obj;
return Objects.equals(name.get(), rhs.name.get()) &&
Objects.equals(age.get(), rhs.age.get());
}
}
那么两种方法中的哪一种是写hashCode()
的正确方法?或者正确的方法是完全不同的?
答案 0 :(得分:1)
属性不会覆盖hashCode
和equals
。您可以通过转到他们的文档页面(例如StringProperty
)并向下滚动到它所说的“#34;从类java.lang.Object
继承的方法"”来验证这一点。如果列出了hashCode
和equals
,那么它们就不会被覆盖。
因此,例如name.get().hashCode()
是正确的。 name.hashCode()
将返回Object
定义的标识哈希码。
equals
也是如此。例如,name.equals(rhs.name)
会从Object
调用基本实现,这与name == rhs.name
相同。
答案 1 :(得分:0)
方法hashCode()是帮助计算机知道两个对象快速不相等,上面写的两个方法都可以。 如果你使用java 1.7+,你可以使用
Objects.hash(filed1,filed2,filed3,.....)
简化。