JAVA中String对象的地址

问题描述 投票:0回答:4

我有一个关于JAVA中对象地址的问题。

以下是我的代码。

public class StringCompare {

    public static void main(String[] args) {
        String s1 = "apple";
        String s2 = "apple";
        String s3 = new String("apple");

        boolean b1 = (s1 == s2);
        boolean b2 = (s1 == s3);
        boolean b3 = s1.equals(s2);

        System.out.println(b1); // true
        System.out.println(b2); // false
        System.out.println(b3); // true

        System.out.println("");

        System.out.println("Address of s1 = " + Integer.toHexString(s1.hashCode()));    // 58b835a 
        System.out.println("Address of s2 = " + Integer.toHexString(s2.hashCode()));    // 58b835a
        System.out.println("Address of s3 = " + Integer.toHexString(s3.hashCode()));    // 58b835a
    }
}

我认为对象(s1和s2)的地址是相同的。
我认为对象(s3)的地址不等于s1,s2。

但是.. 结果是对象(s1,s2,s3)的地址是相同的。

enter image description here

我不知道为什么s1,s2,s3地址是相同的..

请给我一些建议。
谢谢。

java
4个回答
2
投票

根据

Object.hashCode()
的文档:

如果根据 equals(Object) 方法两个对象相等,则对这两个对象调用 hashCode 方法必须产生相同的整数结果。

由于

String
覆盖了
equals()
,它也覆盖了
hashCode()
以履行此合同。这意味着两个不同的对象
equals()
仍将具有相同的哈希码。请注意,这意味着哈希码“不是”对象的地址。 (尽管,Object.hashCode()中的默认实现返回对象本身的唯一标识符,这有点类似于它的地址。请注意,这满足
equals()
契约,因为默认实现仅在比较对同一对象的两个引用时才返回 true对象。)
    


0
投票
String

的地址。

hashCode()
Object
返回类似地址的内容,但
String
会覆盖
hashCode()
。最后,您可以使用 
==
测试引用相等性,但是(正如您似乎知道的那样),您可以使用
.equals()
进行相等性测试。
    


0
投票
.hashcode()

不返回地址,它返回Java中每个类隐式提供的哈希值。欲了解更多信息,您可以阅读

这里


0
投票

字符串hashCode:对于字符串,hashCode()方法根据字符串的内容计算哈希码,而不是内存地址。字符串的哈希码的公式是基于字符串中的字符,但它并不直接反映内存地址。 由于 s1、s2 和 s3 的值为“apple”,因此这三个字符串的哈希码将相同,因为内容相同。在您的情况下,“apple”的哈希码在所有三个字符串中恰好相同,从而导致每个字符串的打印值相同。 哈希码不是实际的内存地址,而是从字符串的内容派生出来的。对于所有三个字符串对象来说,它恰好是相同的,因为它们都代表相同的值“apple”。

重要提示:

Integer.toHexString(s1.hashCode()) 打印的值只是哈希码,而不是对象的内存地址。对于具有相同值的所有 String 对象,哈希码将相同,这就是为什么您在示例中看到 s1、s2 和 s3 具有相同的哈希码。

哈希码:

s1、s2、s3 的 hashCode() 是相同的,因为这三个都代表相同的字符串值“apple”。哈希码基于字符串的值,而不是其内存地址。

© www.soinside.com 2019 - 2024. All rights reserved.