到底创建了几个对象

到底创建了几个对象

在某程序员交友网站看到String的问题,自己动手验证了一下这里和大家一起分析一下结果

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

从简单的入手

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

问创建了一个对象

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

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

所以看的出来只创建了一个对象常量池中的对象

我们使用javap -c 反编译验证

  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
复制代码

可见两个方法是等价的

结果

一个常量池中的对象

重头戏

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个对象

写在最后

个人分析如果不对还请各位大佬指出

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享