Sat*_*tya 6 java string stringbuilder bytecode object
我正在讨论在Java中使用Strings和StringBuffers的问题.在这两个例子的每一个中创建了多少个对象?
例1:
String s = "a";
s = s + "b";
s = s + "c";
Run Code Online (Sandbox Code Playgroud)
例2:
StringBuilder sb = new StringBuilder("a");
sb.append("b");
sb.append("c");
Run Code Online (Sandbox Code Playgroud)
在我看来,Ex 1将创建5,而Ex 2将创建4个对象.
我使用了内存分析器来获取确切的计数.
在我的机器上,第一个示例创建了8个对象:
String s = "a";
s = s + "b";
s = s + "c";
Run Code Online (Sandbox Code Playgroud)
String;StringBuilder;char[].另一方面,第二个例子:
StringBuffer sb = new StringBuffer("a");
sb.append("b");
sb.append("c");
Run Code Online (Sandbox Code Playgroud)
创建2个对象:
StringBuilder;char[].这是使用JDK 1.6u30.
PS为了使比较公平,你可能应该sb.toString()在第二个例子结束时调用.
在创建的对象方面:
示例1创建了8个对象:
String s = "a"; // No object created
s = s + "b"; // 1 StringBuilder/StringBuffer + 1 String + 2 char[] (1 for SB and 1 for String)
s = s + "c"; // 1 StringBuilder/StringBuffer + 1 String + 2 char[] (1 for SB and 1 for String)
Run Code Online (Sandbox Code Playgroud)
示例2创建了2个对象:
StringBuffer sb = new StringBuffer("a"); // 1 StringBuffer + 1 char[] (in SB)
sb.append("b"); // 0
sb.append("c"); // 0
Run Code Online (Sandbox Code Playgroud)
公平地说,我不知道新的char []实际上是用Java创建了一个Object(但我知道它们是创建的).感谢aix指出了这一点.
您可以通过分析 java 字节码来确定答案(使用javap -c)。示例 1 创建两个StringBuilder对象(请参见第 #4 行)和两个String对象(请参见第 #7 行),而示例 2 创建一个StringBuilder对象(请参见第 #2 行)。
请注意,您还必须考虑char[]对象(因为数组是 Java 中的对象)。String和StringBuilder对象都是使用底层实现的char[]。因此,示例 1 创建了八个对象,示例 2 创建了两个对象。
示例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
}
Run Code Online (Sandbox Code Playgroud)
示例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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |