【问题标题】:In Java HashSet, how it calculate hashCode for custom object? [duplicate]在 Java HashSet 中,它如何计算自定义对象的 hashCode? [复制]
【发布时间】:2014-08-11 17:13:31
【问题描述】:

如果我们不重写 hashCode(),它默认如何计算自定义对象的 hashCode?​​strong>

class TrieNode {
    Character letter;
    TrieNode parent;
    Map<Character, TrieNode> children;
    boolean isEndOfWord;
    TrieNode(Character letter, TrieNode parent, boolean isEndOfWord) {
        this.letter = letter;
        this.parent = parent;
        this.isEndOfWord = isEndOfWord;
        children = new HashMap<Character, TrieNode>();
    }
}

用法:

Set<TrieNode> set = new HashSet<TrieNode>();
TrieNode trieNode = new TrieNode('c', parentNode, true);
set.add(trieNode);


注意:
  • 如果我们不覆盖“hashCode()”。

澄清问题:

  • 默认情况下,此 HashSet 如何计算此自定义的 hashCode 对象?
  • 在 Java 文档中的哪里可以找到它?

补充:
我试图在 Java 文档中找到它,但没有得到它。
我试图找到这些地方:

  • HashSet.class
  • AbstractSet.class
  • Object.class
  • System.class

【问题讨论】:

  • Object.hashCode 将被使用,如果你不覆盖它。
  • 每个类都扩展了Object,并且这个类有一个定义的hashCode

标签: java hashmap javadoc hashcode custom-object


【解决方案1】:

如果我们不覆盖hashCode(),默认如何计算自定义对象的hashCode?​​p>

它使用 Object 的 hashCode() 方法。本质上它是一个参考地址。 Javadoc 说,

在合理可行的情况下,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但 JavaTM 编程语言不需要这种实现技术。)

【讨论】:

  • 嗨@ElliotFrisch,当我检查“AbstractSet.class”时,它调用对象的hashCode()来计算哈希码,然后我检查了object.hashCode()。我发现 Object.class 确实实现了它,然后我不知道下一个提示在哪里......从你的说法“但是 JavaTM 编程语言不需要这种实现技术”,是不是意味着, java中肯定没有hashCode()的实现,也许只是其他组织实现的?
  • 我在回答中提供了 Javadoc 链接。它在java.lang.Object#hashCode()
  • 有道理!非常感谢!
【解决方案2】:

所有类都继承了Object类,该类具有hashcode()方法。它通常在转换对象的内部地址时返回一个不同的值,但这不是必需的

【讨论】:

  • 谢谢@KumarAbhinav,我明白了,好像是“public static native int identityHashCode(Object x);”计算对象的地址,为什么找不到实现?那不是开源的?
猜你喜欢
  • 1970-01-01
  • 2020-01-26
  • 2019-09-24
  • 2023-02-14
  • 2011-12-19
  • 1970-01-01
  • 2010-09-12
  • 2016-05-28
  • 2021-12-29
相关资源
最近更新 更多