显式铸造一个对象并比较产量意外的答案

时间:2013-10-20 04:09:51

标签: java

考虑以下情况:

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!

==默认为被answer in StackOverflow.

进行比较的对象.equals

因为,我将它们作为对象进行投射,不应该使用默认比较作为参考比较吗?

4 个答案:

答案 0 :(得分:5)

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

字符串文字的东西是它们是同一个对象!详细说明:当你创建像你正在做的字符串时(称为字符串文字):

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

JVM使用所谓的字符串池。它在字符串中保留字符串并在代码中找到已存在于池中的文字时重用它们。所以cat和cat2都引用了字符串池中的相同对象。

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

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

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

答案 1 :(得分:1)

在java中,编译时字符串常量为interned,因此是同一个对象!也就是说,catcat2拥有相同的引用。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

此处有两个错误:==不“默认为.equals”,它始终表示参考比较,如果您使用.equals则无关紧要:一个对象对于使用哪个覆盖版本的方法没有区别。