public static void main(String[] args) {
String s="a";
String s1="a"+"b";
String s2="a"+"b";
String s3=s+"b";
String s4=s+"b";
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s3==s4);
}
输出结果是true、false、false,but why?
使用javap命令,得到jvm处理过程如下:
0: ldc #16 // String a
2: astore_1
3: ldc #18 // String ab
5: astore_2
6: ldc #18 // String ab
8: astore_3
9: new #20 // class java/lang/StringBuilder
12: dup
13: aload_1
14: invokestatic #22 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
17: invokespecial #28 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
20: ldc #31 // String b
22: invokevirtual #33 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
25: invokevirtual #37 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
28: astore 4
30: new #20 // class java/lang/StringBuilder
33: dup
34: aload_1
35: invokestatic #22 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
38: invokespecial #28 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
41: ldc #31 // String b
43: invokevirtual #33 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
46: invokevirtual #37 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
49: astore 5
51: getstatic #41 // Field java/lang/System.out:Ljava/io/PrintStream;
原来对于 String s1=”a”+”b”;这种,jvm会直接处理为String s1=”a”+”b”,
String s3=s+”b”会处理为String s3=new StringBulider(s).append(“b”).toString();
总结:字符串”+”的处理方式是当出现变量的时候会使用StringBulider处理,没有变量的话就直接合并。