创建了多少个对象 [英] How many objects are created
问题描述
我正在讨论如何在Java中使用 String
和 StringBuffer
。这两个示例中每个都创建了多少个对象?
I was having a discussion about usage of String
s and StringBuffer
s in Java. How many objects are created in each of these two examples?
Ex 1:
String s = "a";
s = s + "b";
s = s + "c";
Ex 2:
StringBuilder sb = new StringBuilder("a");
sb.append("b");
sb.append("c");
在我看来,Ex 1将创建5,而Ex 2将创建4个对象。
In my opinion, Ex 1 will create 5 and Ex 2 will create 4 objects.
推荐答案
您可以通过分析java字节码来确定答案(使用 javap -c
) 。示例1创建两个 StringBuilder
对象(参见第4行)和两个 String
对象(参见第7行),同时示例2创建一个 StringBuilder
对象(参见第2行)。
You can determine the answer by analyzing the java bytecode (use javap -c
). Example 1 creates two StringBuilder
objects (see line #4) and two String
objects (see line #7), while example 2 creates one StringBuilder
object (see line #2).
请注意,您还必须考虑 char []
对象(因为数组是Java中的对象)。 String
和 StringBuilder
对象都使用底层 char [] $ c $实现C>。因此,示例1创建八个对象,示例2创建两个对象。
Note that you must also take the char[]
objects into account (since arrays are objects in Java). String
and StringBuilder
objects are both implemented using an underlying char[]
. Thus, example 1 creates eight objects and example 2 creates two objects.
示例1:
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String a
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 b
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: new #3; //class java/lang/StringBuilder
26: dup
27: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
30: aload_1
31: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
34: ldc #8; //String c
36: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
39: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
42: astore_1
43: return
}
示例2 :
public static void main(java.lang.String[]);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: ldc #3; //String a
6: invokespecial #4; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
9: astore_1
10: aload_1
11: ldc #5; //String b
13: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: pop
17: aload_1
18: ldc #7; //String c
20: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: pop
24: return
}
这篇关于创建了多少个对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!