这是关于'+'运算符返回的结果的差异。结果因String literal和String Object而异。
String str="ab";
String str1="c";
String str2 = "ab"+"c"; // Line 3
String str3 = "abc";
String str4 = str+str1; // Line 5
System.out.println(str2==str3); // True
System.out.println(str2==str4); // False
结果我们可以推断出,对于字面值,返回字符串池中已有的对象,如第3行的情况,并返回字符串对象,返回新对象,如第5行所示。为什么会这样?
答案 0 :(得分:9)
+
的{{1}}操作符的处理方式不同,具体取决于表达式的计算时间。
当表达式可以在编译时计算时(如第3行所示),编译器将创建仅包含连接的String
。因此,在第3行中,只会创建String
“abc”,并且此String
将被放入.class文件中。因此,String
和str3
将完全相同并将被实习。
当使用只能在运行时评估的连接时(如第5行),结果str4
是新的String
,必须与String
进行比较,因为它是新的对象
答案 1 :(得分:3)
String str2 = "ab"+"c";
这是在编译时评估的。它进入常量池,因为它已经为编译器所知。
另一个可以在运行时进行评估,它不会成为常量池的一部分。
这是一个很好的机会,可以注意到与使用String#concat的情况的区别,如果你这样做
String str2 = "ab".concat("c");
由于String是不可变的,因此从concat
返回一个新的String,导致str
无法实现。因此,在这种情况下,str2 == str3
将为false
。
答案 2 :(得分:0)
我已经将问题标记为重复,但发现类似的答案没有发布,所以考虑给它一个去。其他答案已经指出为什么答案是错误的。 但这里有一些东西可以告诉你什么时候会成真。
如果您在第二个字符串上调用intern()
,则结果将为true
。
为什么会这样?
为了节省内存(并加快测试是否相等),Java支持字符串的“实习”。在String上调用intern()
方法时,将对实习字符串表执行查找。如果表中已存在具有相同内容的String对象,则返回对表中String的引用。否则,将String添加到表中,并返回对它的引用。
String str4 = (str+str1).intern();
明确调用intern()
会返回对 interned 字符串的引用。
答案 3 :(得分:0)
当你创建str,str1,str2和str3时,它将指向相同的字符串池。这里它不会创建字符串对象。 但是当你创建String str4 = str + str1.So str4是在运行时计算的。所以它不会是同一个字符串池的一部分,其中所有其他字符串都是指向的。所以str4返回false ..