如何在Java中计算hashCode()

2022-08-31 15:31:27

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

我读到它是一个对象的记忆参考...的哈希值为 1;的哈希值为 97。new Integer(1)String("a")

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


答案 1

返回的值绝不保证是对象的内存地址。我不确定类中的实现,但请记住,大多数类将重写,以便语义等效(但不是同一实例)的两个实例将哈希到相同的值。如果类可以在另一个数据结构(如 Set)中使用,则这一点尤其重要,该结构依赖于 与 一致。hashCode()ObjecthashCode()hashCodeequals

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

但是,甚至可以为多个对象返回相同的哈希值。有关说明,请参阅注释,但这里有一个示例程序,该程序不断生成对象,直到找到两个具有相同.当我运行它时,它很快找到两个匹配的,平均在向映射添加大约86,000个长包装器对象(和键的整数包装器)之后。System.identityHashCode()System.identityHashCode()System.identityHashCode()

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

答案 2

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