java本身支持使用“+”来拼接字符串,同时String类不可变(通过读源代码,可以看出其实String对象是可以改变的)。而java拼接字符串是否会出现中间的多余String对象?当然答案是不会的,原因在于编译器将java源代码编译为bytecode过程中。
通过反编译javap命令来反编译一段java代码可以看出,使用“+”来链接字符串,实际上编译器使用了强大的StringBulder对象,并且在拼接的过程中调用其StringBuilder.append()方法来实现字符串的链接。这样就不会出现空间浪费的问题。
java源代码:
public class Concatenation {
public static void main(String[] args) {
String userName = "Andy";
String age = "24";
String job = "Developer";
String info = userName + age + job;
System.out.println(info);
}
}
反编译后的代码:
public class Concatenation {
public Concatenation();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String Andy
2: astore_1
3: ldc #3 // String 24
5: astore_2
6: ldc #4 // String Developer
8: astore_3
9: new #5 // class java/lang/StringBuilder
12: dup
13: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
16: aload_1
17: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: aload_2
21: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24: aload_3
25: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
28: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
31: astore 4
33: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
36: aload 4
38: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
41: return
}
参考博文:http://droidyue.com/blog/2014/08/30/java-details-string-concatenation/