我有一个包含许多bean类(例如ItemBean)的项目:
public class ItemBean
{
private String name;
private int id;
getters/setters...
}
我写了一个自定义的equals方法,因为如果两个项目具有相同的ID和名称,则无论它们在内存中是否是相同的对象,都应视为相等。我现在正在考虑编写自定义hashCode()函数。我查看了其他stackoverflow questions和this tutorial,但是它们看起来过于笼统,而我正在寻找简单bean类的最佳实践。
我想出了这种方法:
使用缓存
使用ItemBean的equals方法中涉及的所有属性
使用另一个堆栈溢出问题中所述的17/31'幻数'素数。
实现方法:
public final int hashCode()
{
if (cachedHashCode == 0)
{
int result = 17;
result = 31 * (result + id);
cachedHashCode = 31 * (result + name.hashCode());
}
return cachedHashCode;
}
优良作法是将这样的哈希码方法基于使其唯一的类的所有属性吗?如果不是,此方法的缺点是什么?如果我的一个bean类具有10个属性而不是2个属性,那么对10个属性进行XOR运算是否应该避免?
最佳答案
从Object.hashCode()
的JavaDoc:
如果根据equals(Object)方法,两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
这可以通过使用hashCode
中使用的所有equals
成员来实现,反之亦然。
What is a best practice of writing hash function in java?中描述的alorightms值得关注。
我不会担心性能。 ^
是一个非常基本的运算符,可以通过JVM进行优化。