javap看编译器优化

有这么一道题
下面这行代码中,创建了几个String对象

        String str = "hello" + "world" + 360;

按照我们原有的理解,“hello”是一个对象,“world”是一个对象,360也将转成一个对象。最后又创建一个新对象,将这三个字符串拼接。这样就是4个对象了。

但事实上只创建了一个对象,这件事情就涉及了“编译器优化这一件事”

编译器优化做的最核心的事:调整当前执行代码(可能是调整执行顺序,也可能事调整语句内容)
希望最终的程序执行效果等价,并且执行效率有所提高。

不同版本的jdk优化效果不同。

我们就可以借助javap这个操作
javap对.class 文件进行反编译

  1. 右键package,在终端中打开
  2. dir命令可以看到当前的.java文件
  3. javac Test11_5.java -encoding utf8
  4. dir,发现一个test.class文件
  5. javap Test11_5.class,然后就会看到一个Java的代码
  6. javap -help
  7. 找到 -c 对代码进行反汇编
  8. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值