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