如何用Java编写hashcode()方法?

时间:2018-08-01 04:15:07

标签: java android

我从来没有机会用Java编写哈希码函数,但是现在我需要这样做。我该怎么办?

它用于ArrayList,每个元素包含5个字符串,仅此而已。

我找到了一个包含2个字符串的ArrayList的示例,它非常简单:

return 31 * lastName.hashCode() + firstName.hashCode();

我可以摆脱同样简单的问题吗?

return 31 * field1.hashcode() + field2.hashcode() + field3.hashcode() + field4.hashcode() + field5.hashcode();

或者hashcode()方法是否还有其他要求?

我在这里找到了另一个关于hashcode()的StackOverflow讨论:Best implementation for hashCode method

从那开始,我模仿了一个答案,并提出了以下答案:

return Objects.hash(this.mClientCode, this.mOrderNumber, this.mOrderDate, this.mTicketsSold, this.mSellerName);

那比我建议的第一个更好吗?为什么?

由于hashcode()和equals()显然总是应该同时更改,所以这就是我的equals():

   public boolean equals(Object o) {

    if (!(o instanceof SalesItem)) {
        return false;
    }

    SalesItem n = (SalesItem) o;

    return n.mClientCode.equals(mClientCode) && n.mOrderNumber.equals(mOrderNumber) &&
            n.mOrderDate.equals(mOrderDate) && n.mTicketsSold.equals(mTicketsSold) &&
            n.mSellerName.equals(mSellerName);
}

这看起来还好吗?

2 个答案:

答案 0 :(得分:1)

您的对等几乎是正确的。如果这些值均不能为null,则表示其良好。如果可以,那么您还需要添加空检查-if((n.lastName!= null && n.lastName.equals(lastname))||(n.lastName == null && lastname == null))然后为其他人重复。

对于哈希-您想要的是必须尽可能随机地分布,并且对于您认为唯一的值必须唯一。我们很难告诉您一个好的哈希算法,因为我们不知道如何使用您的数据结构。例如,如果只有4个卖家,那么您希望该字段是哈希中很小的一个因素,如果有的话。

这是数据库行的表示吗?看起来像一个。因为如果是这样,则最好对行进行rowId或UUID哈希处理。

答案 1 :(得分:0)

您还可以在HashCodeBuilder库中使用org.apache.commons.lang3

以下是文档和示例:
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/HashCodeBuilder.html