字符串拼接的原理:
+ 和 StringBuilder
编译的实现,做了优化,+ 会 new StringBuider 进行优化,然后进行append。多次进行了new StringBuilder 然后append,效率不高,尽量自己定义StringBuilder比较好。
String total = ""; // 生成空字符串对象 String ""
total = "ab" + "cd"; // 生成abcd字符串对象String "abcd"
total += "ef"; // 生成StringBuilder , append "abcd" ,append "ef", toString 方法返回
if (1 < 2) {
total += "higk"; // 生成StringBuilder , append "abcdef" ,append "higk" , toString 返回
}
javap -l -c -p CglibDemo.class
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: ldc #2 // String
2: astore_1
3: ldc #3 // String abcd
5: astore_1
6: new #4 // class java/lang/StringBuilder
9: dup
10: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
13: aload_1
14: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: ldc #7 // String ef
19: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
25: astore_1
26: new #4 // class java/lang/StringBuilder
29: dup
30: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
33: aload_1
34: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
37: ldc #9 // String higk
39: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
42: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
45: astore_1
46: return
LineNumberTable:
line 24: 0
line 25: 3
line 26: 6
line 28: 26
line 31: 46
LocalVariableTable:
Start Length Slot Name Signature
0 47 0 args [Ljava/lang/String;
3 44 1 total Ljava/lang/String;
StringBuffer 和 StringBuilder的比较:
线程安全性:StringBuffer 是线程安全的,而StringBuilder是非线程安全
缓冲区:StringBuffer采用了缓冲,而StringBuilder没有
性能:StringBudiler 远大于StringBuffer