到底建立了几个对象

各位大哥点点赞

本次实验jdk版本java

java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08) Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode) 复制代码

在某程序员交友网站看到String的问题,本身动手验证了一下这里和你们一块儿分析一下结果程序员

咱们分析的时候都认为常量池中是空的markdown

从简单的入手

public static String demo() {
  final String a = "abc";
  final String b = "def";
  return a + b;
}
复制代码

问建立了一个对象app

其实这个咱们很容易就看出来和下列代码等价网站

public static String demo2() {
  return "abcdef";
}
复制代码

因此看的出来只建立了一个对象常量池中的对象ui

咱们使用javap -c 反编译验证spa

public static java.lang.String demo();
    Code:
       0: ldc           #5                  // String abcdef
       2: areturn

  public static java.lang.String demo2();
    Code:
       0: ldc           #5                  // String abcdef
       2: areturn
复制代码

可见两个方法是等价的code

结果

一个常量池中的对象orm

重头戏

public static String demo() {
  String a = "abc";
  String b = "def";
  return a+b;
}
复制代码

首先分析 "abc" 和 "def" 必定会进入常量池 因此这就是两个常量池对象了对象

接下来咱们看看 a + b 发生了什么

public static java.lang.String demo();
    Code:
       0: ldc           #5                  // String abc
       2: astore_0
       3: ldc           #6                  // String def
       5: astore_1
       6: new           #7                  // class java/lang/StringBuilder
       9: dup
      10: invokespecial #8                  // Method java/lang/StringBuilder."<init>":()V
      13: aload_0
      14: invokevirtual #9                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      17: aload_1
      18: invokevirtual #9                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      21: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      24: areturn
复制代码

从6:开始能够看出 "abc" + "def" 使用的是 StringBuilder处理的 因此这里建立了一个StringBuilder对象

21: 能够看出StringBuilder调用的是toString方法这时又建立了一个String对象

结果

2个常量池中的对象 + 1个StringBuilder对象 + 1个String对象 = 4个对象

写在最后

我的分析若是不对还请各位大佬指出

相关文章
相关标签/搜索