到底建立了幾個對象

各位大哥點點贊

本次實驗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個對象

寫在最後

我的分析若是不對還請各位大佬指出

相關文章
相關標籤/搜索