【问题标题】:Can different objects with same value for the attributes have same hashcode in Java属性值相同的不同对象可以在Java中具有相同的哈希码吗
【发布时间】:2018-08-30 20:15:34
【问题描述】:

我是 Java 新手,我对 Java 对象的哈希码有疑问:

public class HelloWorld
{
  String name;
  int age;
}

属性值相同的不同对象会有相同的hashCode吗?

HelloWorld hello1 = new HelloWorld();
hello1.name = "hello";
hello1.age = 20;

HelloWorld hello2 = new HelloWorld();
hello2.name = "hello";
hello2.age = 20;

hello1hello2 会有相同的 hashCode 吗?

另外,属性值不同的对象是否有可能具有相同的hashCode?​​p>

【问题讨论】:

  • 是的,他们可以。是的,这是可能的。
  • 如何实现 hashCode 产生不同的结果?
  • 使用无冲突的perfect hashing function。然而,这不是Object::hashCode 方法的目标。它不应该保证每个都有不同的值。其主要目的是优化在 HashSetHashMap 等哈希结构中的搜索。
  • @ratzip 你不能 - hashCode 返回一个 int,它被限制为 40 亿个值。但是您可以创建更多不同的对象:其中一些虽然没有相同的字段值,但将具有相同的hashCode

标签: java hashcode


【解决方案1】:

您尚未覆盖hashCode() 方法,因此 hashCode 本质上是随机的,因此对于两个不同的对象可能相同也可能不同,而不管它们的字段值如何。但是,获得相同 hashCode 的概率会非常低。

【讨论】:

    【解决方案2】:

    相等的对象意味着相等的哈希码。

    相等的哈希码并不意味着相等的对象。

    不相等的哈希码表示不相等的对象。

    【讨论】:

      【解决方案3】:

      任何类都可以覆盖hashCode() 以返回它想要的任何东西,所以是的。

      如果您需要测试对象是否相等,请使用equals(),对于对象身份,请使用==

      两个相等的对象应该返回相等的哈希值,但是两个不相等的对象也可以返回相等的哈希值。大多数表示数据的类都需要覆盖这两种方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 2011-09-23
        • 2013-04-30
        相关资源
        最近更新 更多