概述
有这么一道题
下面这行代码中,创建了几个String对象
String str = "hello" + "world" + 360;
按照我们原有的理解,“hello”是一个对象,“world”是一个对象,360也将转成一个对象。最后又创建一个新对象,将这三个字符串拼接。这样就是4个对象了。
但事实上只创建了一个对象,这件事情就涉及了“编译器优化这一件事”
编译器优化做的最核心的事:调整当前执行代码(可能是调整执行顺序,也可能事调整语句内容)
希望最终的程序执行效果等价,并且执行效率有所提高。
不同版本的jdk优化效果不同。
我们就可以借助javap这个操作
javap对.class 文件进行反编译
- 右键package,在终端中打开
- dir命令可以看到当前的.java文件
- javac Test11_5.java -encoding utf8
- dir,发现一个test.class文件
- javap Test11_5.class,然后就会看到一个Java的代码
- javap -help
- 找到 -c 对代码进行反汇编
- javap -c Test11_5.class
找到main 方法里面的汇编指令
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String helloworld360
2: astore_1
3: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
6: invokevirtual #4 // Method java/io/PrintStream.println:()V
9: return
我们发现 0: ,只创建了一个字符串常量,
我们将代码改一下,在执行上面的同样操作
String str2 = 360 + "";
String str = "hello" + "world" + str2;
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String 360
2: astore_1
3: new #3 // class java/lang/StringBuilder
6: dup
7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
10: ldc #5 // String helloworld
12: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: aload_1
16: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_2
23: return
}
我们分析一下
0:创建了一个字符串对象
3:new了一个Stringbuilder对象
10:创建了一个helloword对象
12:和16:分别都有一次append
最后
以上就是缓慢小刺猬为你收集整理的javap看编译器优化的全部内容,希望文章能够帮你解决javap看编译器优化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复