由于字符串不可变性,使得“abc” + "123" 会创建3个对象:"abc"、"123"、“abc123”。
而“abc” + "123" +"test"则会创建"abc"、“123”、“test”、"abc123" 、"abc123test"对象。
由于该过程产生了很多不必要的临时对象,针对该情况有了StringBuider和StringBuffer类的出现。
但是由于+号使用起来简单方便、可读性较好,开发人员仍爱用+号,而不是那两个类。
针对此情况,java做了许多的优化:
对于常量连接:
String str = "abc" + "123" + 1;
编译后: String str = "abc1231";
对于与变量连接,
虽然StringBuilder可以使得不会创建中间字符串,只会创建各个子串,但可读性较差,因此仍然爱用+作为连接。针对这个情况从java 6开始,java编译器采用了StringBuider进行拼接。
对于变量字符串拼接,则会改为用StringBuilder进行连接:
String str2 = "abc";
str2 += "test";
编译后:
String str2 = "abc";
str2 = (new StringBuilder()).append(str2).append("test").toString();
值得注意的是,循环中会创建额外的Stringbuider。
String str2 = "abc"; for(int i = 0; i < 3; i++){ str2 += "12243"; }
编译后:
String str2 = "abc"; for(int i = 0; i < 3; i++) str2 = (new StringBuilder()).append(str2).append("12243").toString();
因此,在未用循环的情况下,可以使用+来连接,而用了循环还是用StringBuider为好。
以上过程,可以通过jad反编译看到。将jad.exe放在java.exe同目录即可。简单命令为:jad -8 -r xxx.class