【问题标题】:What happens if I return constant integer when overriding hashCode() function? [duplicate]如果我在覆盖 hashCode() 函数时返回常量整数会发生什么? [复制]
【发布时间】:2017-02-27 12:28:25
【问题描述】:

当我在以下语句中使用hashCode() 方法时:

System.out.println(obj.getClass().getName() + "@" +
                  Integer.toHexString(System.identityHashCode(obj))); 

我得到这样的输出:

“联系@29453f441”

这对于每个单独的对象都是唯一的。覆盖hashCode() 会有什么影响?

【问题讨论】:

  • 尝试使用 Set 并多次添加同一个对象....
  • 集合的性能会有一些问题。 stackoverflow.com/questions/26674729/…
  • 顺便说一句,这不是hashCode() 返回的内容。这就是toString() 返回的内容。

标签: java hashcode


【解决方案1】:

您将失去哈希图所提供的任何性能,它可以在 O(1) 时间内从集合中检索具有不同哈希值的对象,这是我们在使用 HashMaps 时想要实现的目标。

这是另一个问题的引述:

当两个不相等的对象具有相同的哈希值时,这会导致哈希表中的冲突,因为两个对象都希望在同一个槽中(有时称为存储桶)。

如果您不使用 hashmap 或其他依赖于对象哈希码的算法,则不会导致任何问题。

至于比较,它们将通过equals() 进行区分。

【讨论】:

    【解决方案2】:

    来自系统类的文档

    public static int identityHashCode(Object x)

    无论给定对象的类是否覆盖 hashCode(),返回给定对象的哈希码与默认方法 hashCode() 返回的哈希码相同。空引用的哈希码为零。

    所以即使 hashcode() 被覆盖,它也不应该影响它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多