关于String与StringBuffer的.
来源:互联网 发布:棋牌游戏源码修改软件 编辑:程序博客网 时间:2024/05/21 18:29
都说StringBuffer比String效率高.所以详细看看!
其结论为: 至于推荐用StringBuffer来代替String+拼装字符串,说的是循环方式下
- public class Bigint {
- public static void main(String[] args) {
- String a = "a";
- String b = "b";
- String c = "c";
- String s = a + b + c;
- }
- }
生成如下byteCode:
// Compiled from Bigint.java (version 1.5 : 49.0, super bit)
public class com.kinghi.xlink.test.Bigint {
// Method descriptor #6 ()V
// Stack: 1, Locals: 1
public Bigint();
0 aload_0 [this]
1 invokespecial java.lang.Object() [8]
4 return
Line numbers:
[pc: 0, line: 5]
Local variable table:
[pc: 0, pc: 5] local: this index: 0 type: com.kinghi.xlink.test.Bigint
// Method descriptor #15 ([Ljava/lang/String;)V
// Stack: 3, Locals: 5
public static void main(java.lang.String[] args);
0 ldc <String "a"> [16]
2 astore_1 [a]
3 ldc <String "b"> [18]
5 astore_2 [b]
6 ldc <String "c"> [20]
8 astore_3 [c]
9 new java.lang.StringBuilder [22]
12 dup
13 aload_1 [a]
14 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [24]
17 invokespecial java.lang.StringBuilder(java.lang.String) [30]
20 aload_2 [b]
21 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [33]
24 aload_3 [c]
25 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [33]
28 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [37]
31 astore 4 [s]
33 return
Line numbers:
[pc: 0, line: 7]
[pc: 3, line: 8]
[pc: 6, line: 9]
[pc: 9, line: 10]
[pc: 33, line: 11]
Local variable table:
[pc: 0, pc: 34] local: args index: 0 type: java.lang.String[]
[pc: 3, pc: 34] local: a index: 1 type: java.lang.String
[pc: 6, pc: 34] local: b index: 2 type: java.lang.String
[pc: 9, pc: 34] local: c index: 3 type: java.lang.String
[pc: 33, pc: 34] local: s index: 4 type: java.lang.String
}
可知其也是通过StringBuilder来相加的.
至于推荐用StringBuffer来代替String+拼装字符串,说的是循环方式下,如:
- public class Test4 {
- public static void main(String[] args) {
- String s = "s";
- for (int i = 0; i < 20; i++) {
- s += i;
- }
- }
- }
对应的bytecode为:
public class Test4 extends java.lang.Object{
public Test4();
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 s
2: astore_1
3: iconst_0
4: istore_2
5: iload_2
6: bipush 20
8: if_icmpge 36
11: new #3; //class StringBuffer
14: dup
15: invokespecial #4; //Method java/lang/StringBuffer."<init>":()V
18: aload_1
19: invokevirtual #5; //Method java/lang/StringBuffer.append:(Ljava/lang/S
tring;)Ljava/lang/StringBuffer;
22: iload_2
23: invokevirtual #6; //Method java/lang/StringBuffer.append:(I)Ljava/lang
/StringBuffer;
26: invokevirtual #7; //Method java/lang/StringBuffer.toString:()Ljava/lan
g/String;
29: astore_1
30: iinc 2, 1
33: goto 5
36: return
}
如果用String+的方式,每循环一次,就会重新new一个StringBuffer对象,这样的内存消耗完全是不必要的(在数据量大的情况下,还会导致内存不足的错误),所以要这样做:
public class Test5 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("s");
for (int i = 0; i < 20; i++) {
sb.append(i);
}
}
}
这样无论循环多少次,都只会生成一个StringBuffer对象
- 关于String与StringBuffer的.
- 关于String与StringBuffer
- 关于String与StringBuffer的区别
- 关于String与StringBuilder、StringBuffer
- 关于String,StringBuffer与StringBuilder
- 关于String ,StringBuffer的性能
- StringBuffer以及StringBuffer与String的区别
- String与StringBuffer的区别?
- string与stringBuffer的区别
- StringBuffer与String的比较
- string与stringbuffer的区别
- string与stringbuffer的区别
- String与StringBuffer的区别
- String与StringBuffer的区别
- string与stringbuffer的区别
- String与StringBuffer的区别?
- String与StringBuffer的区别?
- String与StringBuffer的区别
- vs2008安装失败解决过程
- 通信原理第六版
- cmd命令
- 投出简历的第二天
- Global中防止SQL注入的方法
- 关于String与StringBuffer的.
- 第三天投了第6、7封简历
- 向指定HWND发送字符串
- 单元测试(2):使用JUnit
- Telerik RadControls for ASP.NET AJAX Q2 2008 SP2
- DynamicPDF Viewer v1.0
- 体验 Delphi2009 的 JSON
- AlmDev BusinessSkinForm v6.50 for Delphi BCB Full
- 鹰的重生