【问题标题】:hash of java hashtablejava hashtable的hash
【发布时间】:2011-01-04 00:28:40
【问题描述】:

java Hashtable 元素的 hashCode 总是唯一的?

如果不是,我如何保证一次搜索就能找到正确的元素?

【问题讨论】:

    标签: java hashtable hashcode


    【解决方案1】:

    不一定。两个不同(且不相等)的对象可以具有相同的哈希码。

    【讨论】:

    • 为了回答你问题的后半部分,HashTable 不使用 HashCode 来决定相等性。它使用 Equals 来决定返回什么。它使用 HashCode 将事情缩小到少数元素以针对 Equals 进行测试。
    【解决方案2】:

    第一件事。
    您应该考虑使用 HashMap 而不是 Hashtable,因为后者被认为已过时(它强制执行隐式同步,大多数情况下不需要。如果您需要同步的 HashMap,这很容易实现)

    现在,关于您的问题。
    不保证哈希码在数学上是唯一的,
    但是,当您使用 HashMap(或 Hashtable)时,这并不重要。
    如果两个键生成相同的哈希码,则会在每个键上自动调用 equals 以确保检索到正确的对象。

    如果您使用字符串作为键,则放心,

    但如果您使用自己的对象作为键,则应覆盖 equals 和 hashCode 方法。
    equals 方法对于正确操作 HashMap 是必需的,而 hashCode 方法应编码为使得哈希表相对稀疏(否则您的哈希图将只是一个长数组)
    如果您使用的是 Eclipse,有一种简单的方法可以生成 hashCode 和 equals,它基本上可以为您完成所有工作。

    【讨论】:

    • 你确定 Eclipse 可以自动生成 hashCode 和 equals 吗?我对此表示怀疑,但也许你可以通过添加更多解释来证明我错了。谢谢。
    • 右击编辑器,从上下文菜单中选择源 -> 生成 hashCode() 和 equals()..
    • 现在我明白了,我从未使用过它。感谢您的意见。
    【解决方案3】:

    来自Javadocumentation

    hashCode的一般合约是:

    • 每当在同一对象上多次调用它时 执行 Java 应用程序时,hashCode 方法必须一致 返回相同的整数,前提是在 equals 比较中未使用任何信息 对对象进行修改。这个整数不需要保持一致 从应用程序的一次执行到同一应用程序的另一次执行 应用。

    • 如果两个对象根据equals(Object)相等 方法,然后必须对两个对象中的每一个调用 hashCode 方法 产生相同的整数结果。

    • 如果两个对象不相等,则不需要 equals(java.lang.Object) 方法,然后在每个上调用 hashCode 方法 这两个对象必须产生不同的整数结果。然而 程序员应该知道产生不同的整数结果 不相等的对象可能会提高哈希表的性能。

    在合理可行的情况下, 类定义的 hashCode 方法 对象确实返回不同的整数 对于不同的对象。 (这是 通常通过转换实现 对象的内部地址 成一个整数,但这 实现技术不是 JavaTM 编程要求 语言。)

    所以是的,您通常可以期望 Object 的默认 hashCode 是唯一的。但是,如果该方法已被您存储在 Hashtable 中的类覆盖,则所有赌注都将关闭。

    【讨论】:

      【解决方案4】:

      理想情况下,是的。实际上,碰撞确实偶尔会发生。

      【讨论】:

        【解决方案5】:

        java Hashtable 元素的 hashCode 总是唯一的?

        他们应该。至少在同一个班级。

        如果不是,我如何保证一次搜索就能找到正确的元素?

        通过为您的班级指定一个好的hasCode 实现:Override equals() and hashCode

        【讨论】:

          猜你喜欢
          • 2019-12-20
          • 1970-01-01
          • 2010-11-15
          • 2012-07-27
          • 2019-05-02
          • 1970-01-01
          • 1970-01-01
          • 2011-06-05
          • 1970-01-01
          相关资源
          最近更新 更多