几个对象跟帖!请关注,并指点!
StringBuffer a = "";
a+="this"
一共创建了几个对象
关于这样的问题怎么做呢
怎么理解呢
请各位给我指点迷津
我以前发过这样个帖子,呵呵,我把更新信息又新发了一个帖子,不然各位可能就不继续关注了,请谅解!!!
更新如下
我问我朋友的问题如下
跟上个帖子的问题基本一样,只不过多了几个问题。
一、String a = "";
a+="this"; //这里"this"是我随便写的一个字符串。
问题1、
那么这个是创建了几个对象呢 ,
(这样String可以吗,是不是要改成StringBuffer)
问题2、
a+="this"; 如果改为 a = a +"this"那么创建的对象数目有改变吗
问题3、
怎么来理解创建几个对象的问题呢?这个怎么跟池,堆这些东西关联起来呢
产生了几个对象的问题纯粹是一个用来考试的问题。
String a = "";
a+="this";
至少产生了3个对象:“”,“this”,和由相加产生的“this”。你可以用如下程序来验证:
String s1="";
String s2="hello";
s1 += "hello";
System.out.println(s2=="hello"); //结果为true
System.out.println(s1=="hello"); //结果不false
至于把a+="this"; 改成a = a + "this";不会产生任何不同,你可以对照一下:
修改前的字节码:
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String
2: astore_1
3: new #3; //class java/lang/StringBuilder
6: dup
7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
10: aload_1
11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: ldc #6; //String hello
16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
23: return
修改后的字节码:
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String
2: astore_1
3: new #3; //class java/lang/StringBuilder
6: dup
7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
10: aload_1
11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: ldc #6; //String hello
16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
23: return
没有变化。
从字节码中可以看到,在0、14、和19这三个地方创建了3个String对象。前两个是直接用ldc从字符串池中加载的,第三个是toString创建的。
你大致可以认为常量是从池中加载的,不是常量的(往往可以看到new)是从堆中创建的。
其实不管哪种形式,都另外创建了一个java/lang/StringBuilder对象,在3那个地方,所以实际对象是4个。但是估计出题的人未必知道是4个,他肯定觉得3个是正确答案。
至于在C++中,string a="";a+="this";只会创建一个对象a。而写成string a="";a=a+"this";会创建两个对象,一个是a,一个是用来保存a+"this"这个结果的临时对象。
我的一个做了N年开发的朋友给了我上面的答案,请各位看下并帮忙指点理解。