从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);两个句子的结果都不会写入常量池
- 从JVM的角度分析String对象的创建
- 从 JVM 的角度解析 String 的不可变特性
- 从jvm编译优化角度解读String的赋值比较
- jQuery源码分析以及从jQuery对象创建的角度理解extend方法的原理
- 从jvm运行机制来分析String对象
- 从jvm运行机制来分析String对象
- [jvm]对象的创建
- JVM对象的创建
- JVM--对象的创建
- JVM对象的创建
- JVM对象的创建
- 编辑从字节码和 JVM 的角度解析 Java 核心类 String 的不可变特性
- 从内存角度去分析String s1= "abc"与String s2 = new String("abc")的问题
- JVM源码分析之Java对象的创建过程
- JVM源码分析之Java对象的创建过程
- 从二进制的角度看对象
- String对象的创建
- String对象的创建
- 域名重定向
- 【转帖】30岁软件工程师的悲哀
- Nokia N9/N10将使用MeeGo操作系统
- RHCE 033 unit12
- Flash Recovery Area空间不足导致数据库不能打开或hang住
- 从JVM的角度分析String对象的创建
- 《Essential Linux Device Drivers》 第6章 Serial Drivers
- Oracle 10g Statistic数据统计
- IT从业者的职业规划/IT从业者的学习规划
- eclispe for php wamp xdebug 配置
- Linux 内核中的红黑树
- JVM_Xms_Xmx_初始值(Sun Jdk)
- 《Essential Linux Device Drivers》 第5章 Character Driver
- diff 与 patch