`
aine_pan
  • 浏览: 43889 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

String+=和StringBuilder.append以及StringBuffer.append的比较

阅读更多
大家都知道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<100000;i++){
			a+="a";
		}
		long end = System.currentTimeMillis();
		System.out.println("String:"+(end-star));
		
		star = System.currentTimeMillis();
		for(int i=0;i<100000;i++){
			b.append("b");
		}
		end = System.currentTimeMillis();
		System.out.println("StringBuilder:"+(end-star));
		
		star = System.currentTimeMillis();
		for(int i=0;i<100000;i++){
			c.append("c");
		}
		end = System.currentTimeMillis();
		System.out.println("StringBuffer:"+(end-star));
	}

测试结果
String:5355
StringBuilder:6
StringBuffer:9

测试结论
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
这样就可以理解为什么效率差这么多了!
分享到:
评论

相关推荐

    测试string的+和String.Format()和StringBuilder.Append()性能差距|TestForString.7z

    测试string的+和String.Format()和StringBuilder.Append()性能差距,一个检测它们时间的测试

    String,StringBuffer,StringBuilder区别

    String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的

    Java StringBuffer & StringBuilder.pdf

    它们与String类类似,但是不同之处在于,StringBuffer和StringBuilder可以修改字符串内容,而String对象是不可变的; StringBuffer和StringBuilder类的用法基本相同,但StringBuilder类的效率更高,因为它不是线程...

    常用、经典算法及讲解 <img src="/images/sunny.gif" align="abs

    子集定和问题 5. 素数方阵 6. 全排列问题 7. 移盘子问题 8. N 女王问题 9. 组合问题 10. 电子锁 11. 高精度数加减法 12. 高精度数乘法 13. 高精度数除法(一) 14. 高精度数除法(二) 15. 高精度数阶乘 16. P×S=11......

    jsonjar包及使用方式.zip

    在java开发中使用json... stringBuilder.append( jsobj.getString("mac")+",") .append(jsobj.getString("start")+",") .append(jsobj.getString("end")+",") .append(key+",").append( brandMap.get(key)+"\n");

    String StringBuffer和StringBuilder区别之源码解析

    String StringBuffer和StringBuilder 区别之源码解析 从源码角度简单对它们之间的区别进行了验证

    String、StringBuilder和StringBuffer的区别

    String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别

    Myeclipse破译

    String dx = new StringBuilder(need).append(LL).append(userId).toString(); int suf = this.decode(dx); String code = new StringBuilder(need).append(String.valueOf(suf)) .toString(); return ...

    webbrowser+Nsoup.rar

    webbrowser+Nsoup 实现百度文库内容复制 NSoup.Nodes.Document ... StringBuilder content = new StringBuilder(); for (int i = 0; i ; i++) { content.Append(NSoupDoc.Body.Select("#pageNo-"+(i+1)).Text); }

    String ,StringBuffer与StringBuilder

    String ,StringBuffer与StringBuilder的区别

    String工具箱

    public static StringBuilder append(StringBuilder sb,String []arg){ sb.append(arg[0]); for(int i=1,len=arg.length;i;i++){ sb.append(","); sb.append(arg[i]); } return sb; } public ...

    跟我学Java-day13-String和StringBuilder.pdf

    day13-String和StringBuilder 1.String类 1.1字符串的比较【理解】 1.1.1==号的作用 比较基本数据类型:比较的是具体的值 比较引用数据类型:比较的是对象地址值 1.1.2equals方法的作用 方法介绍 示例代码 ...

    String及StringBuffer和StringBuilder的区别

    String及StringBuffer和StringBuilder的区别

    获取文件MD5码

    private string GetMD5HashFromFile(string fileName) { try { FileStream file = new FileStream(fileName, FileMode.Open); System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5...

    java代码获取myeclipse注册码.txt

    String need = new StringBuilder(userId.substring(0, 1)).append(type).append("300").append(licenseNum).append(verTime).toString(); String dx = new StringBuilder(need).append(LL).append(userId)....

    String、StringBuffer、StringBuilder的使用方法

    介绍了String、StringBuffer、StringBuilder的使用方法,以及理论知识

    Sqlite 操作类 C# .net

    StringBuilder sb = new StringBuilder(); while (reader.Read()) { sb.Append("username:").Append(reader.GetInt32(0)).Append("\n") .Append("password:").Append(reader.GetString(1)); } Console....

    中文分词ChineseAnalyzer.rar

    StringBuilder sb = new StringBuilder(); sb.Remove(0, sb.Length); string t1 = ""; int i = 0; Analyzer analyzer = new Lucene.China.ChineseAnalyzer(); StringReader sr = new StringReader(richTextBox...

    c#方便调用次世代AntiVC.dll插件

    StringBuilder Result = new StringBuilder('\0',256); string FilePath = textBox1.Text; string ImgPath = System.Environment.CurrentDirectory + "\\temp.tmp"; //以下使用GetVcodeFromFile接口 //...

    String-StringBuffer-StringBuilder

    简单的介绍了String、StringBuffer和StringBuilder的区别

Global site tag (gtag.js) - Google Analytics