如果两个对象具有相同的哈希码,那么它们的内存地址呢?

Rah*_*thi 1 java hash hashcode

如果同一类的两个对象在 Java 中具有相同的 hashCode,那么它们将如何存储在HashMap/ 中HashTable?哈希码和内存地址的实际架构是什么。hashCode 驻留在内存中的什么位置?

例子:有一个类A。创建对象时a1a2它们将代表一些内存地址,但我每次都覆盖了哈希码。当我阅读一篇文章时,我发现 hashcode 函数从内存地址生成一个 hashcode。这意味着如果哈希码相同,内存地址将相同。请解开我的疑惑。

public class A {

    @Override
    public int hashCode() {
        return 1;
    }

    public static void main(String args[]) {
        A a1 = new A();
        A a2 = new A();
        System.out.println(a1.hashCode());
        System.out.println(a2.hashCode());
    }
}
Run Code Online (Sandbox Code Playgroud)

Wyz*_*a-- 5

没有两个对象(同时存在)可以具有相同的内存地址。

它们可以具有相同的哈希码,尽管hashCode实现会尽量避免这种情况。并且 的默认实现hashCode不必基于对象的内存地址(尽管可以)。

因此,如果两个对象具有相同的哈希码,则不能假设它们具有相同的内存地址。事实上,如果两个变量引用不同的对象(即比较它们与==返回false),它们肯定没有相同的地址。

您阅读的有关基于内存地址的哈希码的文章指的是类中方法的默认实现。如果在子类中进行覆盖,则不再使用该默认实现。您与内存地址无关。hashCodeObjecthashCodereturn 1