从JVM的角度分析String对象的创建

来源:互联网 发布:韩顺平php 编辑:程序博客网 时间:2024/05/01 12:41

测试一:

 字节码

 0 new #21 <java/lang/String>
 3 dup
 4 ldc #28 <a>
 6 invokespecial #25 <java/lang/String.<init>>
 9 astore_0
10 ldc #32 <b>
12 astore_1
13 return

从 4 ldc #28 <a> 可以看出String s1 = new String("a");会创建两个对象,一个是常量池中的,一个是堆中的

测试二:

字节码

 0 ldc #28 <a>
 2 astore_0
 3 ldc #32 <b>
 5 astore_1
 6 ldc #43 <ab>
 8 astore_2
 9 ldc #70 <c>
11 astore_3
12 ldc #72 <d>
14 astore 4
16 new #30 <java/lang/StringBuilder>
19 dup
20 aload_3
21 invokestatic #45 <java/lang/String.valueOf>
24 invokespecial #34 <java/lang/StringBuilder.<init>>
27 aload 4
29 invokevirtual #35 <java/lang/StringBuilder.append>
32 invokevirtual #39 <java/lang/StringBuilder.toString>
35 astore 5
37 return

从上面红色标注字节码可以看出,Java编译器做了优化

测试三:

字节码

 0 ldc #28 <a>
 2 astore_0
 3 ldc #32 <b>
 5 astore_1
 6 new #30 <java/lang/StringBuilder>
 9 dup
10 ldc #49 <cd>
12 invokespecial #34 <java/lang/StringBuilder.<init>>
15 aload_0
16 invokevirtual #35 <java/lang/StringBuilder.append>
19 aload_1
20 invokevirtual #35 <java/lang/StringBuilder.append>
23 ldc #51 <e>
25 invokevirtual #35 <java/lang/StringBuilder.append>
28 ldc #53 <f>
30 invokevirtual #35 <java/lang/StringBuilder.append>
33 invokevirtual #39 <java/lang/StringBuilder.toString>
36 astore_2
37 return
从以上红色标注字节码可以看出"c"+"d"+s1+s2会有优化,s1+s2+"e"+"f";不会有优化,,"+"从左到右执行,s1以及s2是变量,编译时期无法确定.

测试4:

字节码

 0 ldc #28 <a>
 2 astore_0
 3 ldc #32 <b>
 5 astore_1
 6 new #21 <java/lang/String>
 9 dup
10 new #30 <java/lang/StringBuilder>
13 dup
14 aload_0
15 invokestatic #45 <java/lang/String.valueOf>
18 invokespecial #34 <java/lang/StringBuilder.<init>>
21 aload_1
22 invokevirtual #35 <java/lang/StringBuilder.append>
25 invokevirtual #39 <java/lang/StringBuilder.toString>
28 invokespecial #25 <java/lang/String.<init>>
31 astore_2
32 new #30 <java/lang/StringBuilder>
35 dup
36 aload_0
37 invokestatic #45 <java/lang/String.valueOf>
40 invokespecial #34 <java/lang/StringBuilder.<init>>
43 aload_1
44 invokevirtual #35 <java/lang/StringBuilder.append>
47 invokevirtual #39 <java/lang/StringBuilder.toString>
50 astore_3
51 return
  String s4= s1+s2;
  String s5= new String("c"+s1);两个句子的结果都不会写入常量池

原创粉丝点击