显式地转换对象并比较产量意外的anwer

Mat*_*ian 0 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!
Run Code Online (Sandbox Code Playgroud)

在StackOverflow中通过answer进行比较的Object 的==默认值..equals

既然,我将它们作为对象进行转换,它们不应该使用默认比较作为参考比较吗?

Mat*_*zyk 5

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

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

String cat = "cat";
String cat2 = "cat"; 
Run Code Online (Sandbox Code Playgroud)

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

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

String cat = new String("cat");
String cat2 = new String("cat"); 
Run Code Online (Sandbox Code Playgroud)

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