Java中Bean类的哈希函数

时间:2014-07-28 09:19:34

标签: java javabeans hashcode

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

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


    getters/setters...
}

我编写了一个自定义equals方法,因为如果它们具有相同的id和名称,则应将两个项视为相等,无论它们是否与内存中的相同对象相同。我现在正在研究编写自定义hashCode()函数。我查看了其他stackoverflow questionsthis tutorial,但它们似乎过于笼统,而我正在寻找简单bean类的最佳实践。

我想出了这个方法:

  • 使用缓存
  • 使用ItemBean的equals方法中涉及的所有属性
  • 使用17/31'魔法数字'其他stackoverflow问题中描述的素数。

已实施方法:

public final int hashCode()
{
    if (cachedHashCode == 0)
    {
        int result = 17;
        result = 31 * (result + id);
        cachedHashCode = 31 * (result + name.hashCode());
    }

    return cachedHashCode;
}

将类似这样的哈希码方法建立在使其独特的类的所有属性上是一种好的做法吗?如果没有,这种方法的缺点是什么,哪些是更好的选择?如果一个我的bean类有10个属性而不是只有2个属性,那么XOR的10个属性是否是一个应该避免的昂贵操作?

1 个答案:

答案 0 :(得分:1)

来自Object.hashCode()的JavaDoc:

  

如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须产生相同的整数结果。

这可以通过使用hashCodeequals中使用的所有成员来实现,反之亦然。

What is a best practice of writing hash function in java?中描述的alorightms值得关注。

我不担心性能。 ^是一个非常基本的运算符,可以由JVM优化。