我有一个包含许多bean类(例如ItemBean)的项目:

public class ItemBean
{
    private String name;
    private int id;


    getters/setters...
}


我写了一个自定义的equals方法,因为如果两个项目具有相同的ID和名称,则无论它们在内存中是否是相同的对象,都应视为相等。我现在正在考虑编写自定义hashCode()函数。我查看了其他stackoverflow questionsthis 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进行优化。

08-28 16:19