0

考虑以下情况:

String cat = "cat";
String cat2 = "cat";        
out.println(cat == cat2);  // true // Uses String#equals(...)
out.println(((Object) cat) == ((Object) cat2));  // true. Object#equals(...)???
// So it should be false!

StackOverflow中通过答案比较的对象的==默认值。.equals

因为,我将这些转换为对象,他们不应该使用默认比较,即参考比较吗?

4

4 回答 4

5

是的,这就是它正在做的事情。

字符串文字的问题是它们是同一个对象!详细说明:当您像正在做的那样创建字符串时(称为字符串文字):

String cat = "cat";
String cat2 = "cat"; 

JVM 使用所谓的字符串池。它将字符串保存在其中,并在代码中找到已经在池中的文字时重用它们。所以 cat 和 cat2 都从字符串池中引用同一个对象。

另一方面,如果你这样做:

String cat = new String("cat");
String cat2 = new String("cat"); 

然后 cat 和 cat2 将引用不同的对象,因为new每次都会创建一个新的 String 对象,并且不会重用字符串池中的对象 --> 结果将如您所想的那样。

于 2013-10-20T04:11:42.910 回答
1

在java中,编译时String常量是interned,所以它们是同一个对象!也就是说,catcat2持有相同的参考。

与 C++ 不同,java 不会重载运算符,因此==运算符总是比较引用,就像类的equals()方法的实现一样Object

于 2013-10-20T04:12:23.353 回答
1

如果两个变量引用相同的字符串字面量,JVM 会自动强制变量引用相同的字符串字面量。这是可能的,因为字符串是不可变的。这也节省了内存。

于 2013-10-20T04:13:46.317 回答
0

这里有两个错误:==不“默认为.equals”,它总是意味着引用比较,如果你使用它也没关系.equals:强制转换一个对象对于使用哪个方法的覆盖版本没有影响.

于 2013-10-20T04:12:04.637 回答