JAVA中String对象的地址

时间:2014-10-26 06:16:10

标签: java

我对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地址相同..

请给我一些建议。
感谢。

3 个答案:

答案 0 :(得分:2)

根据Object.hashCode()的文档:

  

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

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

答案 1 :(得分:0)

您无法获得String的地址。 Object的{​​{3}}会返回类似地址的内容,但String会覆盖hashCode()。最后,您可以使用==测试引用相等性,但(您似乎知道),使用.equals()进行相等性测试。

答案 2 :(得分:0)

.hashcode()不返回地址,它返回一个哈希值,Java中的每个类都隐式提供该值。有关详细信息,请阅读here