Java中hashCode()是如何计算的

新手上路,请多包涵

hashCode() 方法在java中返回什么值?

我读到它是一个对象的内存引用… new Integer(1) 的哈希值是 1; String("a") 的散列值是 97。

我很困惑:它是 ASCII 还是什么类型的值?

原文由 Jothi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 700
2 个回答

哈希码是一个整数值,表示调用它的对象的状态。这就是为什么设置为 1 的 Integer 将返回哈希码“1”的原因,因为 Integer's 哈希码及其值是相同的。字符的哈希码等于它的 ASCII 字符代码。如果您编写自定义类型,您有责任创建一个良好的 hashCode 最能代表当前实例状态的实现。

原文由 Andrew Hare 发布,翻译遵循 CC BY-SA 2.5 许可协议

hashCode() 返回的值绝不保证是对象的内存地址。我不确定 Object 类中的实现,但请记住大多数类将覆盖 hashCode() 这样两个实例在语义上是等价的(但不是同一个实例)将散列为相同的值。如果这些类可以在另一个数据结构(例如 Set)中使用,这一点尤其重要,它依赖于 hashCodeequals 一致。

无论如何,没有 hashCode() 唯一标识一个对象的实例。如果您想要基于底层指针的哈希码(例如在 Sun 的实现中),请使用 System.identityHashCode() - 这将委托给默认的 hashCode 方法,无论它是否已被覆盖。

尽管如此,即使 System.identityHashCode() 也可以为多个对象返回相同的散列。请参阅评论以获取解释,但这是一个示例程序,它会不断生成对象,直到找到两个具有相同 System.identityHashCode() 的对象。当我运行它时,它会快速找到两个匹配的 System.identityHashCode() ,在将大约 86,000 个 Long 包装器对象(和键的 Integer 包装器)添加到地图后平均。

 public static void main(String[] args) {
    Map<Integer,Long> map = new HashMap<>();
    Random generator = new Random();
    Collection<Integer> counts = new LinkedList<>();

    Long object = generator.nextLong();
    // We use the identityHashCode as the key into the map
    // This makes it easier to check if any other objects
    // have the same key.
    int hash = System.identityHashCode(object);
    while (!map.containsKey(hash)) {
        map.put(hash, object);
        object = generator.nextLong();
        hash = System.identityHashCode(object);
    }
    System.out.println("Identical maps for size:  " + map.size());
    System.out.println("First object value: " + object);
    System.out.println("Second object value: " + map.get(hash));
    System.out.println("First object identityHash:  " + System.identityHashCode(object));
    System.out.println("Second object identityHash: " + System.identityHashCode(map.get(hash)));
}

示例输出:

 Identical maps for size:  105822
First object value: 7446391633043190962
Second object value: -8143651927768852586
First object identityHash:  2134400190
Second object identityHash: 2134400190

原文由 danben 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题