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

neo*_*one 3 java equals hashcode

我有一个基本的结构类:

class Employee {
int eId;
String eName;

Employee(int id, String name) {
    this.eId= id;
    this.eName= name;
}
Run Code Online (Sandbox Code Playgroud)

equals()如果满足以下任何条件,则相等的条件应返回true:

  1. eId 是一样的
  2. eName 是一样的
  3. 长度eName相同.

我在覆盖方面没有问题equals(),但为了维护哈希码合同,我也应该重写hashCode().因此,哈希码应该依赖于eIdeName.length()(如果eNames为相等,它们的长度将等于为好).所以有四种情况:

Employee e1 = new Employee(4, "John");
Employee e2 = new Employee(3, "Jane");
Employee e3 = new Employee(4, "Jim");
Employee e4 = new Employee(7, "Random");
Run Code Online (Sandbox Code Playgroud)

hashCode()应该为e1,e2和,e3以及不同的值返回相同的值e4.我无法想出满足这一要求的逻辑.

这是确切的问题:

创建一个类(具有参数名称,id等).显示如果将比较此类的2个对象,则它们应在以下任何一种情况下返回true:

A.两者的ID相同.

B.两者的名称相同.

C.两者名称的长度相同.

确保不违反HashCode合同.

dim*_*414 7

你遇到了麻烦,因为你的平等概念是不一致的.具体而言,它不是传递性的,合同.equals()要求.

它是传递性:对于任何非空的参考值x,y以及z,如果x.equals(y)回报率truey.equals(z)回报率true,那么x.equals(z)应该返回true.

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

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

如果Comparator由于某种原因你不能单独使用,你的Employee对象将基本上不一致,并且即使你应该.hashCode()实现"可行",也会证明是有问题的.