我有一个关于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)的地址是相同的。
我不知道为什么s1,s2,s3地址是相同的..
请给我一些建议。
谢谢。
Object.hashCode()
的文档:
如果根据 equals(Object) 方法两个对象相等,则对这两个对象调用 hashCode 方法必须产生相同的整数结果。
由于
String
覆盖了equals()
,它也覆盖了hashCode()
以履行此合同。这意味着两个不同的对象equals()
仍将具有相同的哈希码。请注意,这意味着哈希码“不是”对象的地址。 (尽管,Object.hashCode()
中的默认实现返回对象本身的唯一标识符,这有点类似于它的地址。请注意,这满足equals()
契约,因为默认实现仅在比较对同一对象的两个引用时才返回 true对象。)String
的地址。
hashCode()
的
Object
返回类似地址的内容,但 String
会覆盖 hashCode()
。最后,您可以使用
==
测试引用相等性,但是(正如您似乎知道的那样),您可以使用 .equals()
进行相等性测试。字符串hashCode:对于字符串,hashCode()方法根据字符串的内容计算哈希码,而不是内存地址。字符串的哈希码的公式是基于字符串中的字符,但它并不直接反映内存地址。 由于 s1、s2 和 s3 的值为“apple”,因此这三个字符串的哈希码将相同,因为内容相同。在您的情况下,“apple”的哈希码在所有三个字符串中恰好相同,从而导致每个字符串的打印值相同。 哈希码不是实际的内存地址,而是从字符串的内容派生出来的。对于所有三个字符串对象来说,它恰好是相同的,因为它们都代表相同的值“apple”。
重要提示:Integer.toHexString(s1.hashCode()) 打印的值只是哈希码,而不是对象的内存地址。对于具有相同值的所有 String 对象,哈希码将相同,这就是为什么您在示例中看到 s1、s2 和 s3 具有相同的哈希码。
哈希码:s1、s2、s3 的 hashCode() 是相同的,因为这三个都代表相同的字符串值“apple”。哈希码基于字符串的值,而不是其内存地址。