在平常不管是开发或者面试中,经常会出现字符串相加的情况,那么底层到底是如何实现的呢。
先写一个例子
public class Test {
public static void main(String[] args) {
String str = "";
for(int i = 0; i < 10; i++){
str += "aa";
}
System.out.println(str);
}
}
然后javac Test.java 生成Test.class
然后反编译一下 javap -c Test.class
Compiled from "Test.java"
public class com.example.demo.test.Test {
public com.example.demo.test.Test();
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
2: astore_1
3: iconst_0
4: istore_2
5: iload_2
6: bipush 10
8: if_icmpge 37
11: new #3 // class java/lang/StringBuilder
14: dup
15: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
18: aload_1
19: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: ldc #6 // String aa
24: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
27: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: astore_1
31: iinc 2, 1
34: goto 5
37: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
40: aload_1
41: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
44: return
}
通过反编译后,可以看到,每次循环内都创建了一个StringBuilder对象,会占用大量内存,这也是为什么建议不要在循环内进行字符串拼接,而用StringBuilder的原因了。