本次實驗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個對象
我的分析若是不對還請各位大佬指出