String、StringBuffer、StringBuilder比较

String、StringBuffer、StringBuilder三者是字符串中重要的内容,也是面试过程中经常问到的问题,下面就来总结一下三者的区别。

1.三者都可以存储和操作字符串。

2.String类提供了数值不可改变的字符串,即一旦定义的一个String对象,则不可以对其进行修改,要修改则是新创建了一个String对象。

String str = "a"+"b"+"c";

进行上述操作,则底层操作如下:

String s1 = "a";
String s2 = "b";
String s3 = "c";
String str = s1+s2+s3;

总共创建了四个对象。创建新的对象,则需要消耗更多的资源。

3.StringBuffer和StringBuilder可以对字符串进行修改,如要修改字符串,则是在原串上进行操作,不用进行新对象的创建。

4.StringBuilder:线程非安全

 StringBuffer:线程安全

5.由于以上原因,执行效率:StringBuiler>StringBuffer>String

下面进行代码演示,字符a连接10万个a,即进行10万次操作,可看出三者执行效率:

 1 public class Main {
 2 
 3     public static void main(String[] args) {
4 String str = "a";
5 long t1 = System.currentTimeMillis(); //获得的是自1970-1-01 00:00:00.000 到当前时刻的时间距离,单位为毫秒 6
      for(int i=0;i<100000;i++){
7 str = str+'a';
8 }
9 long t2 = System.currentTimeMillis();
10 System.out.println("String操作所用时间:"+(t2-t1)); 11 12 /*---------------------------------------*/ 13 14 StringBuffer sb = new StringBuffer("a");
15 long t3 = System.currentTimeMillis();
16 for(int i=0;i<100000;i++){
17 sb.append('a');
18 } 19 long t4 = System.currentTimeMillis(); 20
        System.out.println("StringBuffer操作所用时间:"+(t4-t3)); //获取StringBuffer操作所用的时间 21 22 /*---------------------------------------*/ 23 24 StringBuilder sd = new StringBuilder("a");
25 long t5 = System.currentTimeMillis();
26 for(int i=0;i<100000;i++){
27 sd.append('a');
28 } 29 long t6 = System.currentTimeMillis();
30 System.out.println("StringBuilder操作所用时间:"+(t6-t5)); //获取StringBuilder操作所用的时间 31 } 32 33 }

运行结果如下:

可以看出,StringBuffer和Stringbuilder操作效率比String高得多,StringBuilder操作效率稍微大于StringBuffer。

综上,三者使用场景如下:

(1)如果要操作少量的数据用String,更为简洁方便

(2)单线程操作字符串缓冲区下操作大量数据使用StringBuilder

(3)多线程操作字符串缓冲区下操作大量数据使用StringBuffer

 

原文地址:https://www.cnblogs.com/cppeterpan/p/6978992.html