Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中编写hashcode()方法?_Java_Android - Fatal编程技术网

如何在Java中编写hashcode()方法?

如何在Java中编写hashcode()方法?,java,android,Java,Android,我从来没有机会用Java编写hashcode函数,但现在我需要这样做。我该怎么做呢 它用于一个ArrayList,每个元素包含5个字符串,其他什么都不包含 我找到了一个包含2个字符串的ArrayList示例,非常简单: return 31 * lastName.hashCode() + firstName.hashCode(); 我能做一件同样简单的事吗,即: return 31 * field1.hashcode() + field2.hashcode() + field3.hashcode

我从来没有机会用Java编写hashcode函数,但现在我需要这样做。我该怎么做呢

它用于一个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讨论:

因此,我模仿了其中一个答案,并得出了以下结论:

return Objects.hash(this.mClientCode, this.mOrderNumber, this.mOrderDate, this.mTicketsSold, this.mSellerName);
这比我建议的第一个好吗?为什么?

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


看起来还好吗

你的对手几乎是对的。如果这些值都不能为null,那就好了。如果可以,那么您还需要添加null检查-If((n.lastName!=null&&n.lastName.equals(lastName))| |(n.lastName==null&&lastName==null))并对其他检查重复

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


这是数据库行的表示形式吗?看起来像。因为如果是,则行的rowId或UUID将是散列的最佳方式。

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

以下是文档和示例:

Objects.equals
通常比复杂的内联比较更可取。@chrylis Objects.equal(lastname,n.lastname)与lastname.equals(n.lastname)等效,但需要额外的函数调用,没有额外的清晰度,实际上更冗长,并且不允许您控制是否接受null。我不会拒绝这样做的代码审查,但我发现在添加ITE时存在0到略负的值。在这个类级别上应该允许空值,或者不允许空值;在这种情况下,您必须检查它们,而
Objects.equals
会为您执行内联操作。@chrylis但是如果不允许使用null,那么我不希望检查它们的性能受到影响。这就加起来了,特别是在循环中被调用时——这就是为什么许多IDE会在生成equals函数时询问是否要添加空检查的原因。老实说,我不知道Objects.equals是否等于checks。我需要查看它如何处理空值(我想你是对的,但是如果我在代码中阅读它,我需要检查文档)。这是不使用它的另一个原因——我更希望它是显式的。@Gabe Sechan是的,这个ArrayList模仿MySQL表。我定义了这个表,以便主键是ClientCode和OrderNumber的组合,并且表的所有五列中都禁止使用null。但是,此ArrayList用于Android应用程序,该应用程序将插入、更新和删除表中的行。我想我排除了insert和update逻辑,将任何空值插入ArrayList和表(或将现有的非空值更改为空值),因此进入ArrayList的任何空值都将是由于我的编码马虎造成的。;-)
   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);
}