到底创建了几个对象
在某程序员交友网站看到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