本次实验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个对象
我的分析若是不对还请各位大佬指出