我对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地址相同..
请给我一些建议。
感谢。
答案 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