根据这个link,在代码String s="abc"+"xyz";
中的java版本1.5之前,由于使用StringBuilder类进行编译器优化,只创建了一个对象。
new StringBuilder().append(abc).append(xyz).toString()
所以这意味着在java 1.5之前用于创建三个对象的字符串" abc" ,另一个" xyz"第三个" abcxyz"或者它使用像StringBuffer这样的其他类进行类似的编译器优化?
答案 0 :(得分:6)
不,据我所知,总是被视为编译时常量,并且一直等同于
String s = "abcxyz";
请注意,Java 1.5引入了StringBuilder
;在执行时字符串连接使用StringBuffer
之前。
查看first edition of the JLS,已经存在关键句子:
字符串文字 - 或者更常见的是,作为常量表达式(第15.27节)值的字符串被“实现”,以便使用String.intern方法共享唯一实例(第20.12节) 0.47)。
(第15.27节包括字符串连接。)
答案 1 :(得分:4)
代码
String s="abc"+"xyz";
在编译时创建一个String文字。 Java一直都是这样做的。它在Java 5.0中没有改变。
如果你有像这样的代码
那么改变是什么String abc = "abc";
String s = abc + "xyz";
在Java 1.0到1.4中,它使用StringBuffer来执行此操作。它在Java 5.0中被StringBuilder取代,因为如果你不需要线程安全它会更有效率,而在99.9%的情况下,你不需要。