gpt4 book ai didi

java - 为特定条件维护 hashCode 契约(Contract),equals() 取决于两个整数

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:38:20 26 4
gpt4 key购买 nike

我有一个基本类的结构:

class Employee {
int eId;
String eName;

Employee(int id, String name) {
this.eId= id;
this.eName= name;
}

相等的条件是如果以下任何为真,equals() 应返回真:

  1. eId 相同。
  2. eName 相同。
  3. eName 的长度相同。

我在覆盖 equals() 方面没有问题,但是,为了维护哈希码协定,我也应该覆盖 hashCode()。因此,hashCode 应该取决于 eIdeName.length()(如果 eName 相等,则它们的长度也相等) .所以有四种情况:

Employee e1 = new Employee(4, "John");
Employee e2 = new Employee(3, "Jane");
Employee e3 = new Employee(4, "Jim");
Employee e4 = new Employee(7, "Random");

hashCode() 应该为 e1e2e3 返回相同的值和不同的值对于 e4。我想不出满足这个要求的逻辑。

这是确切的问题:

Create a class (having parameters name, id etc). Show that if 2 objects of this class will be compared then they should return true in any of below case :

A. Id of both are same.

B. Name of both are same.

C. Length of name’s of both are same.

Make sure HashCode contract should not violate.

最佳答案

你遇到麻烦是因为你的平等观念不一致。具体来说,它不是传递性的,.equals() 的契约(Contract)需要。

It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.

根据您的定义,e1 等于e2e3,但e2 不等于e3 。这与 Java 的平等概念不相容。这也是您在定义合理的 .hashCode() 实现时遇到麻烦的原因。

然而,您可以做的是定义一个自定义 Comparator (或 Ordering ,如果您使用的是 Guava)。对于大多数用例(如排序、搜索或过滤),您应该能够使用单独的 Comparator 实例,就像使用 .equals() 方法一样。您正在有效地尝试定义等价 对象,而不是相等 对象。

如果您出于某种原因不能使用单独的Comparator,您的Employee 对象将根本不一致,并且即使您应该得到一个“可行的”对象也会证明是有问题的".hashCode() 实现。

关于java - 为特定条件维护 hashCode 契约(Contract),equals() 取决于两个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30229755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com