StringBuilder的append、StringBuffer的append和String str = "a"+"b"的区别?
大家都知道String+String会开销额外的系统资源,粗略的原因是String是不可变类,每一步操作都会返回新的String变量,占用空间及时间。
其实我的理解不是这样的,我们来看看String+的底层实现。
测试案例
public static void main(String[] args) {
String a = "a";
StringBuilder b = new StringBuilder("b");
StringBuffer c = new StringBuffer("c");
long star = System.currentTimeMillis();
for(int i=0;i<200000;i++){
a+="a";
}
long end = System.currentTimeMillis();
System.out.println("String:"+(end-star));
star = System.currentTimeMillis();
for(int i=0;i<200000;i++){
b.append("b");
}
end = System.currentTimeMillis();
System.out.println("StringBuilder:"+(end-star));
star = System.currentTimeMillis();
for(int i=0;i<200000;i++){
c.append("c");
}
end = System.currentTimeMillis();
System.out.println("StringBuffer:"+(end-star));
}
测试结果
String:17735
StringBuilder:6
StringBuffer:7
测试结论
String+ 确实占用了太多的资源,处理效率非常低下。StringBuilder比StringBuffer更新了同步方法,性能有所提升。
原因分析
我用javap -verbose 查看已经编译好的class文件发现:
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=6, locals=9, args_size=1
0: ldc #16 // String a
2: astore_1
3: new #18 // class java/lang/StringBuilder
6: dup
7: ldc #20 // String b
9: invokespecial #22 // Method java/lang/StringBuilder.
<init>":(Ljava/lang/String;)V
12: astore_2
13: new #25 // class java/lang/StringBuffer
16: dup
17: ldc #27 // String c
19: invokespecial #29 // Method java/lang/StringBuffer."
init>":(Ljava/lang/String;)V
22: astore_3
23: invokestatic #30 // Method java/lang/System.current
imeMillis:()J
26: lstore 4
28: iconst_0
29: istore 6
31: goto 57
34: new #18 // class java/lang/StringBuilder
37: dup
38: aload_1
39: invokestatic #36 // Method java/lang/String.valueOf
(Ljava/lang/Object;)Ljava/lang/String;
42: invokespecial #22 // Method java/lang/StringBuilder.
<init>":(Ljava/lang/String;)V
45: ldc #16 // String a
47: invokevirtual #42 // Method java/lang/StringBuilder.
ppend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
50: invokevirtual #46 // Method java/lang/StringBuilder.
oString:()Ljava/lang/String;
53: astore_1
54: iinc 6, 1
57: iload 6
59: ldc #50 // int 100000
61: if_icmplt 34
64: invokestatic #30 // Method java/lang/System.current
imeMillis:()J
67: lstore 6
69: getstatic #51 // Field java/lang/System.out:Ljav
/io/PrintStream;
72: new #18 // class java/lang/StringBuilder
75: dup
76: ldc #55 // String String:
78: invokespecial #22 // Method java/lang/StringBuilder.
<init>":(Ljava/lang/String;)V
81: lload 6
83: lload 4
85: lsub
86: invokevirtual #57 // Method java/lang/StringBuilder.
ppend:(J)Ljava/lang/StringBuilder;
89: invokevirtual #46 // Method java/lang/StringBuilder.
oString:()Ljava/lang/String;
92: invokevirtual #60 // Method java/io/PrintStream.prin
ln:(Ljava/lang/String;)V
95: invokestatic #30 // Method java/lang/System.current
imeMillis:()J
98: lstore 4
100: iconst_0
101: istore 8
103: goto 116
106: aload_2
107: ldc #20 // String b
109: invokevirtual #42 // Method java/lang/StringBuilder.
ppend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
112: pop
113: iinc 8, 1
116: iload 8
118: ldc #50 // int 100000
120: if_icmplt 106
123: invokestatic #30 // Method java/lang/System.current
imeMillis:()J
126: lstore 6
128: getstatic #51 // Field java/lang/System.out:Ljav
/io/PrintStream;
131: new #18 // class java/lang/StringBuilder
134: dup
135: ldc #65 // String StringBuilder:
137: invokespecial #22 // Method java/lang/StringBuilder.
<init>":(Ljava/lang/String;)V
140: lload 6
142: lload 4
144: lsub
145: invokevirtual #57 // Method java/lang/StringBuilder.
ppend:(J)Ljava/lang/StringBuilder;
148: invokevirtual #46 // Method java/lang/StringBuilder.
oString:()Ljava/lang/String;
151: invokevirtual #60 // Method java/io/PrintStream.prin
ln:(Ljava/lang/String;)V
154: invokestatic #30 // Method java/lang/System.current
imeMillis:()J
157: lstore 4
159: iconst_0
160: istore 8
162: goto 175
165: aload_3
166: ldc #27 // String c
168: invokevirtual #67 // Method java/lang/StringBuffer.a
pend:(Ljava/lang/String;)Ljava/lang/StringBuffer;
171: pop
172: iinc 8, 1
175: iload 8
177: ldc #50 // int 100000
179: if_icmplt 165
182: invokestatic #30 // Method java/lang/System.current
imeMillis:()J
185: lstore 6
187: getstatic #51 // Field java/lang/System.out:Ljav
/io/PrintStream;
190: new #18 // class java/lang/StringBuilder
193: dup
194: ldc #70 // String StringBuffer:
196: invokespecial #22 // Method java/lang/StringBuilder.
<init>":(Ljava/lang/String;)V
199: lload 6
201: lload 4
203: lsub
204: invokevirtual #57 // Method java/lang/StringBuilder.
ppend:(J)Ljava/lang/StringBuilder;
207: invokevirtual #46 // Method java/lang/StringBuilder.
oString:()Ljava/lang/String;
210: invokevirtual #60 // Method java/io/PrintStream.prin
ln:(Ljava/lang/String;)V
213: return
从编译的代码来看,String+的准确操作是:
new StringBuilder()
new String.valueof()
StringBuilder.<init>
StringBuilder.append()
StringBuilder.toString()
而StringBuilder的准确操作是:
StringBuilder.append()
而StringBuffer()的准确操作是:
StringBuffer.append
转自http://alqm1314-126-com.iteye.com/blog/1932879
StringBuilder的append、StringBuffer的append和String str = "a"+"b"的区别?的更多相关文章
- String str=new String("a")和String str = "a"有什么区别?
问:String str=new String("a")和String str = "a"有什么区别? 答:String str = "a" ...
- Java中String直接赋字符串和new String的区别 如String str=new String("a")和String str = "a"有什么区别?
百度的面试官问 String A="ABC"; String B=new String("ABC"); 这两个值,A,B 是否相等,如果都往HashSet里面放 ...
- Java中String str=new String("a")和String str = "a"有什么区别?
Q: String A="ABC"; String B=new String("ABC"); 这两个值,A,B 是否相等,如果都往HashSet里面放,能放下吗 ...
- java中String类、StringBuilder类和StringBuffer类详解
本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html 版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolp ...
- StringBuffer的append方法比“+”高效
在字符串的连接过程中StringBuffer的效率要比String高: string操作代码: String str = new String("welcome to "); st ...
- StringBuilder、StringBuffer和String三者的联系和区别
String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a ...
- String类、StringBuilder类、StringBuffer类
String类是不可变类,创建了一个String对象后,该String对象中的字符序列不能被改变. StringBuilder是字符序列可变的字符串类,提供了一系列修改字符串的方法. StringBu ...
- JAVA String、StringBuilder、和StringBuffer的区别,及如何使用
目录 String类 一.String类的理解和创建对象 二.String类创建的方式 两种创建String对象的区别 测试题 三.String常用方法 四.StringBuffer类 1.Strin ...
- StringBuilder的构造方法和append方法
Java中StringBuilder的构造方法 StringBuilder构造方法: public StringBuilder(): 创建一个空白可变的字符串对象,不含有任何内容 public Str ...
随机推荐
- MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类) Ver 1.65
原文发布时间为:2010-02-07 -- 来源于本人的百度文章 [由搬家工具导入] http://www.popub.net/script/MSClass.html/*MSClass (Class ...
- 给gridview增加行链接,点击行任意位置进行跳转
原文发布时间为:2009-04-14 -- 来源于本人的百度文章 [由搬家工具导入] 可这样,在GridView的RowDataBound输入代码,假如id在第0列,且不是摸板列: C# code p ...
- [LeetCode] Compare Version Numbers 字符串操作
Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...
- linux下终端录制
主要是以下三步: 一.安装软件:curl -sL https://asciinema.org/install | sh 二.录制终端:asciinema rec filename 三.回放终端:asc ...
- MySQL冗余数据的三种方案
一,为什么要冗余数据 互联网数据量很大的业务场景,往往数据库需要进行水平切分来降低单库数据量. 水平切分会有一个patition key,通过patition key的查询能够直接定位到库,但是非pa ...
- HDU5006 Resistance(高斯消元)
给你一个复杂的网路图,然后告诉你s,t,求s,t的等效电阻.方法是设s的电势为1,t的电势为0.然后对于其它的每个点x,满足的是sigma(ux-uy)/R(x,y)(即对每个与x相连的节点y,电势差 ...
- python的特殊方法总结
1.跟运算相关的特殊方法 2.跟运算符相关的方法
- javascript解析机制——预解析
JavaScript解析机制是什么? JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个就是执行阶段. * 编译阶段 编译阶段就是我们常说的JavaScript预解析( ...
- 打包python脚本为exe
更新pip 安装
- UVA 11039 Building designing 贪心
题目链接:UVA - 11039 题意描述:建筑师设计房子有两条要求:第一,每一层楼的大小一定比此层楼以上的房子尺寸要大:第二,用蓝色和红色为建筑染色,每相邻的两层楼不能染同一种颜色.现在给出楼层数量 ...