【问题标题】:Java - wrapper classes and hashCode()Java - 包装类和 hashCode()
【发布时间】:2011-04-12 16:29:57
【问题描述】:

Integer 的hashCode()intValue() 返回的黑白值有什么不同吗? hashcode可以是负数吗?

【问题讨论】:

    标签: java hashcode wrapper


    【解决方案1】:

    不,没有区别,因此是的,它可以是负数或零。

    来自Javadoc

    返回:此对象的哈希码值,等于此 Integer 对象表示的原始 int 值。

    【讨论】:

    • 整数 i = new Integer(-1); Map map = new HashMap(); map.put(i, "测试"); // 这会抛出 indexoutofboundsexception 吗??
    • @Arjun:当然不是,地图没有索引。它们有键,键的类型和值是无关紧要的,只要它们正确地实现了 equals 和 hashCode(无论如何都是 HashMap)。
    • AFAIK,hashmap 内部维护着一个链表数组。 map.put(i, "测试"); // 在内部,它会是 array[i.hashCode()] = "test",所以我遇到了这个疑问。如果我错了,请纠正我。
    • @Arjun:确实如此,但它可以很好地处理所有 hashCode 值。如果没有,您将无法执行此操作:map.put("Hello, world!", someObj);。负 hashCode 值与均匀分布散列中的正 hashCode 值一样常见。但是您不会真的认为每个哈希映射都有一个大小为Integer.MAX_VALUE 的数组来容纳所有 positive hashCode,是吗?有简单的模运算可以将任何 int 转换为有效的桶索引。
    • 是的,谢谢,马克,看起来 bucket_index = (i.hashCode() && 0x7FFFFFFFF) % hashmap_size 在这里可以解决问题。
    【解决方案2】:

    Integer.hashCode() 只是返回值,是的......虽然依赖它不是一个好主意。哈希码的返回值实际上应该只用作一个不透明的值而不附加任何特殊含义 - only 真正应该考虑相等性。即使Integer.hashCode()记录 只是返回值(编辑:它是;见其他答案),我会非常警惕如果实现更改为返回会破坏的任何代码(比如)value + 1.

    hashCode() 的返回值当然是允许为负的——这里和一般情况下都是这样。

    【讨论】:

      猜你喜欢
      • 2012-02-26
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多