Java代码:
public class Test // 从Object类继承
{
public static void main(String[] args)
{
String str = "a"+"b"+"c"+"d"+"e";
String stra0 = new String("aaabbb");
String stra1 = new String(str);
StringBuilder strb1 = new StringBuilder("aaaabbbb").append("cccc");
String str1 = "aa";
String str2 = "bb";
String str3 = "cc";
String stra = str1+str2+str3;
}
}
编译class后的字节码:
G:\>javap -c Test
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String abcde
2: astore_1
3: new #3 // class java/lang/String
6: dup
7: ldc #4 // String aaabbb
9: invokespecial #5 // Method java/lang/String."":(Ljava/lang/String;)V
12: astore_2
13: new #3 // class java/lang/String
16: dup
17: aload_1
18: invokespecial #5 // Method java/lang/String."":(Ljava/lang/String;)V
21: astore_3
22: new #6 // class java/lang/StringBuilder
25: dup
26: ldc #7 // String aaaabbbb
28: invokespecial #8 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V
31: ldc #9 // String cccc
33: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
36: astore 4
38: ldc #11 // String aa
40: astore 5
42: ldc #12 // String bb
44: astore 6
46: ldc #13 // String cc
48: astore 7
50: new #6 // class java/lang/StringBuilder
53: dup
54: invokespecial #14 // Method java/lang/StringBuilder."":()V
57: aload 5
59: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
62: aload 6
64: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
67: aload 7
69: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
72: invokevirtual #15 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
75: astore 8
77: return
}
总结:
1、String str = "a"+"b"+"c"+"d"+"e"; 会在编译阶段生成abcde并放到字符串常量池中,不会分别生成a b c d e
2、String stra0 = new String("aaabbb"); 先把字符串aaabbb放到常量池中,再生成该值为aaabbb的String对象
3、字符串用"+"相加时会编译成StringBuilder对象并调用append()方法(注意:如果放到for循环中,可能会在for循环内new StringBuilder(),这个就是String相加速度慢的原因)。
4、放在“”双引号中的字符串都会保证到字符串常量池中,两个字符串用append()相加产生的中间缓存数据和结果结果都不会放到字符串常量池中,加号+相加产生的中间缓存数据和结果结果都会放到字符串常量池中
参考: