我从来没有机会用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);
}
这看起来还好吗?
答案 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
。