给出Java中String的常见操作,并给出字节码分析结果
public static voidfun1(){
//首先在常量池中查找abc这个字符串,如果存在则不会新建,直接引用常量池中已经存在的String
Stringstr1 = "abc";
Stringstr2 = "abc";
System.out.println(str1==str2);//returntrue
}
publicstatic void fun2(){
Stringstr1 = "abc";
String str2 ="ab"+"c";//在编译过程中优化为str2="abc"
System.out.println(str1==str2);//returntrue
}
publicstatic void fun3(){
Stringstr1 = "abc";
Stringstr2 = "ab";
Stringstr3 = "c";
Stringstr4 = str2+str3;//会构建一个新的字符串abc,str4应用该地址,所以return false
System.out.println(str1==str4);//returnfalse
System.out.println(str1.equals(str4));//returntrue
}
字节码如下:
public staticvoid fun1();
Code:
0: ldc #22 // String abc
2: astore_0
3: ldc #22 // String abc
5: astore_1
6: getstatic #24 // Fieldjava/lang/System.out:Ljava/
io/PrintStream;
9: aload_0
10: aload_1
11: if_acmpne 18
14: iconst_1
15: goto 19
18: iconst_0
19: invokevirtual #30 // Methodjava/io/PrintStream.printl
n:(Z)V
22: return
public static void fun2();
Code:
0: ldc #22 // String abc
2: astore_0
3: ldc #22 // String abc
5: astore_1
6: getstatic #24 // Fieldjava/lang/System.out:Ljava/
io/PrintStream;
9: aload_0
10: aload_1
11: if_acmpne 18
14: iconst_1
15: goto 19
18: iconst_0
19: invokevirtual #30 // Methodjava/io/PrintStream.printl
n:(Z)V
22: return
public staticvoid fun3();
Code:
0: ldc #22 // String abc
2: astore_0
3: ldc #43 // String ab
5: astore_1
6: ldc #45 // String c
8: astore_2
9: new #47 // classjava/lang/StringBuilder
12: dup
13: aload_1
14: invokestatic #49 // Methodjava/lang/String.valueOf:(
Ljava/lang/Object;)Ljava/lang/String;
17: invokespecial #53 // Methodjava/lang/StringBuilder."<
init>":(Ljava/lang/String;)V
20: aload_2
21: invokevirtual #56 // Methodjava/lang/StringBuilder.ap
pend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24: invokevirtual #60 // Methodjava/lang/StringBuilder.to
String:()Ljava/lang/String;
27: astore_3
28: getstatic #24 // Fieldjava/lang/System.out:Ljava/
io/PrintStream;
31: aload_0
32: aload_3
33: if_acmpne 40
36: iconst_1
37: goto 41
40: iconst_0
41: invokevirtual #30 // Methodjava/io/PrintStream.printl
n:(Z)V
44: getstatic #24 // Fieldjava/lang/System.out:Ljava/
io/PrintStream;
47: aload_0
48: aload_3
49: invokevirtual #64 // Methodjava/lang/String.equals:(L
java/lang/Object;)Z
52: invokevirtual #30 // Methodjava/io/PrintStream.printl
n:(Z)V
55: return
}
String str4 =str2+str3;//在字节码中出现了StringBuilder所以String的加操作在底层是被解释为StringBuilder来操作的,用append来进行加操作