String,StringBuffer和StringBuilder

来源:互联网 发布:益玩网络 编辑:程序博客网 时间:2024/06/05 07:39

String,StringBuffer和StringBuilder是我们在Java中比较常见的、容易混用的字符串类型。查阅了一些资料,现在简单总结一下。

总的来说:

1、     String是字符串常量,StringBuffer和StringBuilder是字符串变量。

2、     执行速度:StringBuilder > StringBuffer > String。

3、     使用频率:String > StringBuilder > StringBuffer。

String是字符串常量,也就是不可改变的对象,那么可能会产生疑问,如以下代码:

 

String s = "abcd"; s = s+1; System.out.print(s);// 结果打印:abcd1

有的朋友可能觉得s明明发生了改变,事实上这是JVM解释代码时产生的一种欺骗,任何对String的改变都会引发新的String对象的生成,上面的代码实际上是产生了一个新的串“abcd1”赋给了s,而不是s原来的值“abcd”发生了改变。而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样频繁的进行新对象的创建操作,当然速度就快了。

相信许多朋友先接触的应该是StringBuffer,那么既然有可变字符串对象StringBuffer了,为什么还要有StringBuilder呢?事实上,他们的原理和操作基本相同,区别在于StringBuffer支持并发操作,很多方法都是synchronized方法,是线性安全的,适合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用(类似于集合类中HashTable和HashMap)。任何东西都具有两面性,StringBuffer既然支持多线程,就必然意味着在单线程下性能上有所牺牲,也正是因此一半情况下StringBuilder的执行速度比StringBuffer快。下面的例子可以在一定程度上反映出三者的执行速度:

public class UtilsDemo {         public static voidmain(String args []){                   StringBuffersbf = new StringBuffer();                   longt1=System.currentTimeMillis();                   for(int i=0;i<100000; i++){                            sbf.append(i);                   }                   longtime=System.currentTimeMillis()-t1;                   System.out.println("StringBuffer时间:"+time+"毫秒");                                     StringBuildersbd = new StringBuilder();                   long t2=System.currentTimeMillis();                   for(int i=0;i<100000; i++){                            sbd.append(i);                   }                   longtime2=System.currentTimeMillis()-t2;                   System.out.println("StringBuilder时间:"+time2+"毫秒");                                     String str =new String();                   longt3=System.currentTimeMillis();                   for(int i=0;i<100000; i++){                            str= str+i;                   }                   longtime3=System.currentTimeMillis()-t3;                   System.out.println("String时间:"+time3+"毫秒");         }}


执行结果:

StringBuffer时间:12毫秒

StringBuilder时间:5毫秒

String时间:15581毫秒

经过上面的分析,三者的使用场景也就显而易见了:

1.如果要操作少量的数据用 = String

2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder

3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer

 

备注:网上类似的帖子很多,本文由多篇文章整理而来,就不注明出处了,请见谅