因此,在下面的代码中,由于我使用了关键字 new,a == b 将返回 false,其行为符合预期。但是,当我打印内存地址时,我得到相同的值。我认为它们应该有单独的内存地址,如果它们相同为什么会 == 返回 false。下面的代码与 j k l 是相同的概念。
String a = new String("test");
String b = new String("test");
System.out.println(a.equals(b));
System.out.println(a == b);
System.out.println(Integer.toHexString(a.hashCode()));
System.out.println(Integer.toHexString(b.hashCode()));
String j = "this";
String k = new String("this");
String l = "this";
System.out.println(j.equals(l));
System.out.println(j == l);
System.out.println(Integer.toHexString(j.hashCode()));
System.out.println(Integer.toHexString(l.hashCode()));
最佳答案
hashCode
预计不会打印内存地址(尽管默认实现可能会)。这里的关键是 String
已经重写了 equals()
方法,因此必须重写 hashCode()
方法以与其保持一致。也就是说,任何两个根据equals()
相等的对象必须返回相同的hashCode。此要求记录在 Object
的 JavaDoc 中:http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals%28java.lang.Object%29
如果您试图简单地证明两个引用a
和b
具有相同的内存地址,那么这本质上就是Java通过==揭示的内容
。当且仅当两个引用指向完全相同的底层对象时,==
运算符才会返回 true。 (您可以将其视为“具有相同的内存地址”)。另一方面,如果对象在语义上相同,则 .equals()
是一种应该返回 true 的方法。 (例如,具有相同字符的两个不同字符串对象在语义上是相同的。)请注意,equals
是一种方法 - 它并不特殊 - 开发人员可以自由地向其中引入错误。
如果您想进一步尝试该语言以弄清楚 ==
的真正含义,请尝试尝试可变类型(例如 StringBuffer
)。您将看到,如果您有两个 StringBuffer
引用 a
和 b
,且 ==
,则修改 a
也会修改 b
的内容。另一方面,如果 a
和 b
不是 ==
,但 equals()
返回 true,则修改一个将使另一个完好无损。
关于java - Java 中的字符串行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33901718/