gpt4 book ai didi

java - 理想的哈希码实现

转载 作者:行者123 更新时间:2023-11-30 08:29:25 25 4
gpt4 key购买 nike

我的类(class)如下

public class Hash {
int age;
int id;
String name;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Hash other = (Hash) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}


}

在此我只使用了两个属性 name 和 id 来生成 .equals 方法,但现在我的问题是。什么是实现 .hashCode() 方法的好方法。

  1. 仅使用名称和 ID
  2. 使用所有三个姓名、年龄和身份证。

两者的优缺点是什么?

最佳答案

计算哈希码的一个重要规则是您必须使用同样与equals() 实现相关的信息。

因为您没有在您的equals 方法中使用age,所以在您的hashCode 中使用它是错误的!推理非常简单:

  • 假设两个对象 o1 和 o2 具有属性“id=1, age=2, name=foo”和“id=1, age=3, name=foo”。
  • 调用 equals() 将返回 true
  • 调用 hashCode()(在使用 age 的实现上)会返回两个不同的值,但是!

意味着您必须使用所有此类信息。有时只使用一个子集有优势(例如,如果有一些大的、难以散列的对象不太可能是两个对象之间的唯一区别)。

最原始、最正确的实现是这样的:

public int hashCode() {
return 0;
}

这将是正确的,但效率极低(因为每个对象都会散列为相同的值,显然!)。

关于java - 理想的哈希码实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19446963/

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