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:
eId 是一样的eName 是一样的eName相同.我在覆盖方面没有问题equals(),但为了维护哈希码合同,我也应该重写hashCode().因此,哈希码应该依赖于eId和eName.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合同.
你遇到了麻烦,因为你的平等概念是不一致的.具体而言,它不是传递性的,合同.equals()要求.
它是传递性:对于任何非空的参考值
x,y以及z,如果x.equals(y)回报率true和y.equals(z)回报率true,那么x.equals(z)应该返回true.
根据你的定义,e1等于e2和e3,但e2不等于e3.这与Java的平等概念不相容.这也是您在定义合理.hashCode()实施时遇到麻烦的原因.
但是你可以做的是定义一个自定义Comparator(或者Ordering,如果你使用的是Guava).对于大多数用例(如排序,搜索或过滤),您应该能够Comparator像使用该.equals()方法一样使用单独的实例.您正在有效地尝试定义等效对象,而不是相等对象.
如果Comparator由于某种原因你不能单独使用,你的Employee对象将基本上不一致,并且即使你应该.hashCode()实现"可行",也会证明是有问题的.
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |