java - 以下创建了几个对象
本文介绍了java - 以下创建了几个对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
String a,b,c;
a = "a";
b = "b";
a = a+b;
StringBuffer d = new StringBuffer("abc");
d = d.append("567");
我觉得是6个,"a" "b" "ab" "abc" "567" 还有d.
解决方案
说下我的理解,欢迎拍砖
a = "a"; 编译时字符串"a"放入常量池,不会在堆上创建对象
b = "b"; 同理
a = a + b;new 一个StringBuilder对象,append(a), append(b), 最后返回tostring()给a.
StringBuffer d = new StringBuffer("abc"); 这里肯定创建一个对象,同时"abc"进入常量池
d = d.append("567"); StringBuffer 使用一个char数组保存字符串,append会往数组里面加入"567",如果数组容量不够,会进行扩充,默认大小是16 + "abc"的长度 = 19,"abc567"长度为6, 3 + 3 < 19所以不会引起扩容。
还有一点,StringBuffer 和 StringBuilder是继承了AbstractStringBuilder的,可能会引起父类的创建。
这是反编译出来的代码:
/**
*
* 源代码
*public class TestString {
* public static void main(String args[]) {
* String a = "a";
* String b = "b";
* String c = a + b;
* }
*}
*
*/
Compiled from "TestString.java"
public class TestString {
public TestString();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String a
2: astore_1
3: ldc #3 // String b
5: astore_2
6: new #4 // class java/lang/StringBuilder
9: dup
10: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
13: aload_1
14: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: return
}
这篇关于java - 以下创建了几个对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文