在自己以往的学习及工作经验中,形成的概念:
String对象具有不变性,一旦String对象生成,就不可能在被改变;
StringBuffer 线程安全;
StringBuilder 线程不安全;
现针对以上三种Object,在自己机器上手写代码做测试,以验证三者的效率差异:
三种Object同时在3种不同的字符串拼接中,循环5w次,耗时对比:
Source Code: Test.java
public class Test { static int len = 50000; public static void main(String[] args) { System.out.println("---testOne()---"); testOne(); System.out.println("---testTwo()---"); testTwo(); System.out.println("---testThree()---"); testThree(); } static void testOne() { Long t1 = System.currentTimeMillis(); for (int i = 0; i < len; i++) { String result1 = "String" + "and" + "String" + "append"; } Long t2 = System.currentTimeMillis(); for (int i = 0; i < len; i++) { StringBuffer sb = new StringBuffer(); sb.append("String"); sb.append("and"); sb.append("String"); sb.append("append"); } Long t3 = System.currentTimeMillis(); for (int i = 0; i < len; i++) { StringBuilder sb = new StringBuilder(); sb.append("String"); sb.append("and"); sb.append("String"); sb.append("append"); } Long t4 = System.currentTimeMillis(); System.out.println("String:" + (t2 - t1)+"ms"); System.out.println("StringBuffer:" + (t3 - t2)+"ms"); System.out.println("StringBuilder:" + (t4 - t3)+"ms"); } static void testTwo() { String temp = "abcd"; String temp2 = "abcd"; String temp3 = "abcd"; Long t1 = System.currentTimeMillis(); for (int i = 0; i < len; i++) { String result1 = temp + temp2 + temp3; } Long t2 = System.currentTimeMillis(); for (int i = 0; i < len; i++) { StringBuffer sb = new StringBuffer(); sb.append(temp); sb.append(temp2); sb.append(temp3); } Long t3 = System.currentTimeMillis(); for (int i = 0; i < len; i++) { StringBuilder sb = new StringBuilder(); sb.append(temp); sb.append(temp2); sb.append(temp3); } Long t4 = System.currentTimeMillis(); System.out.println("String:" + (t2 - t1)+"ms"); System.out.println("StringBuffer:" + (t3 - t2)+"ms"); System.out.println("StringBuilder:" + (t4 - t3)+"ms"); } static void testThree() { String temp = "abcd"; String temp2 = "abcd"; String temp3 = "abcd"; Long t1 = System.currentTimeMillis(); for (int i = 0; i < len; i++) { String result1 = "String" + "and" + "String" + "append" + temp + temp2 + temp3; } Long t2 = System.currentTimeMillis(); for (int i = 0; i < len; i++) { StringBuffer sb = new StringBuffer(); sb.append("String"); sb.append("and"); sb.append("String"); sb.append("append"); sb.append(temp); sb.append(temp2); sb.append(temp3); } Long t3 = System.currentTimeMillis(); for (int i = 0; i < len; i++) { StringBuilder sb = new StringBuilder(); sb.append("String"); sb.append("and"); sb.append("String"); sb.append("append"); sb.append(temp); sb.append(temp2); sb.append(temp3); } Long t4 = System.currentTimeMillis(); System.out.println("String:" + (t2 - t1)+"ms"); System.out.println("StringBuffer:" + (t3 - t2)+"ms"); System.out.println("StringBuilder:" + (t4 - t3)+"ms"); } }
反编译Test.class
import java.io.PrintStream; public class Test { static int len = 50000; public static void main(String[] args) { System.out.println("---testOne()---"); testOne(); System.out.println("---testTwo()---"); testTwo(); System.out.println("---testThree()---"); testThree(); } static void testOne() { Long t1 = Long.valueOf(System.currentTimeMillis()); for (int i = 0; i < len; i++) { String str = "StringandStringappend"; } Long t2 = Long.valueOf(System.currentTimeMillis()); for (int i = 0; i < len; i++) { StringBuffer sb = new StringBuffer(); sb.append("String"); sb.append("and"); sb.append("String"); sb.append("append"); } Long t3 = Long.valueOf(System.currentTimeMillis()); for (int i = 0; i < len; i++) { StringBuilder sb = new StringBuilder(); sb.append("String"); sb.append("and"); sb.append("String"); sb.append("append"); } Long t4 = Long.valueOf(System.currentTimeMillis()); System.out.println("String:" + (t2.longValue() - t1.longValue()) + "ms"); System.out.println("StringBuffer:" + (t3.longValue() - t2.longValue()) + "ms"); System.out.println("StringBuilder:" + (t4.longValue() - t3.longValue()) + "ms"); } static void testTwo() { String temp = "abcd"; String temp2 = "abcd"; String temp3 = "abcd"; Long t1 = Long.valueOf(System.currentTimeMillis()); for (int i = 0; i < len; i++) { String str1 = temp + temp2 + temp3; } Long t2 = Long.valueOf(System.currentTimeMillis()); for (int i = 0; i < len; i++) { StringBuffer sb = new StringBuffer(); sb.append(temp); sb.append(temp2); sb.append(temp3); } Long t3 = Long.valueOf(System.currentTimeMillis()); for (int i = 0; i < len; i++) { StringBuilder sb = new StringBuilder(); sb.append(temp); sb.append(temp2); sb.append(temp3); } Long t4 = Long.valueOf(System.currentTimeMillis()); System.out.println("String:" + (t2.longValue() - t1.longValue()) + "ms"); System.out.println("StringBuffer:" + (t3.longValue() - t2.longValue()) + "ms"); System.out.println("StringBuilder:" + (t4.longValue() - t3.longValue()) + "ms"); } static void testThree() { String temp = "abcd"; String temp2 = "abcd"; String temp3 = "abcd"; Long t1 = Long.valueOf(System.currentTimeMillis()); for (int i = 0; i < len; i++) { String str1 = "StringandStringappend" + temp + temp2 + temp3; } Long t2 = Long.valueOf(System.currentTimeMillis()); for (int i = 0; i < len; i++) { StringBuffer sb = new StringBuffer(); sb.append("String"); sb.append("and"); sb.append("String"); sb.append("append"); sb.append(temp); sb.append(temp2); sb.append(temp3); } Long t3 = Long.valueOf(System.currentTimeMillis()); for (int i = 0; i < len; i++) { StringBuilder sb = new StringBuilder(); sb.append("String"); sb.append("and"); sb.append("String"); sb.append("append"); sb.append(temp); sb.append(temp2); sb.append(temp3); } Long t4 = Long.valueOf(System.currentTimeMillis()); System.out.println("String:" + (t2.longValue() - t1.longValue()) + "ms"); System.out.println("StringBuffer:" + (t3.longValue() - t2.longValue()) + "ms"); System.out.println("StringBuilder:" + (t4.longValue() - t3.longValue()) + "ms"); } }
测试运行结果:
将len设为50w,运行结果差异会更大;
总结:
对一个注重执行效率的系统,应该根据实际当中不同的业务需求,按需选用String, StringBuffer 或 StringBuilder。
----------------
相关推荐
String StringBuffer和StringBuilder 区别之源码解析 从源码角度简单对它们之间的区别进行了验证
String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的
String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别
StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
下面小编就为大家带来一篇浅谈java中String StringBuffer StringBuilder的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
介绍了String、StringBuffer、StringBuilder的使用方法,以及理论知识
String ,StringBuffer与StringBuilder的区别
简单的介绍了String、StringBuffer和StringBuilder的区别
stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...
String及StringBuffer和StringBuilder的区别
String、StringBuffer 和 StringBuilder 的区别 碎碎念 简单认识这三个对象 String StringBuffer StringBuilder 深入理解 String、StringBuilder、StringBuffer 从设计角度理解 String StringBuilder StringBuffer ...
string,stringbuffer,stringbuilder
string,stringBuffer,stringBuilder
java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间有什么区别呢?下面小编给大家总结了Java中String、StringBuffer、StringBuilder的区别详解,需要的朋友参考下吧
目录StringStringBuffer与StringBuilder总结 String ...StringBuffer与StringBuilder 这两者基本相似,都是可变字符串对象,主要区别为线程是否安全。 总结 最后,引用菜鸟教程下的总结以及相关评论: S
String,StringBuilder,StringBuffer
主要介绍了Java 中 String,StringBuffer 和 StringBuilder 的区别及用法的相关资料,需要的朋友可以参考下
String、StringBuilder以及StringBuffer的区别
Java中String,StringBuffer与StringBuilder的区别和用法。
关于String、StringBuilder、StringBuffer的本质区别,