String、StringBuffer、StringBuilder区别

定义

  • String: 字符串常量,String类是不可变类,因此每次修改String对象时,都要新建一个String对象,造成性能的浪费。
  • StringBuffer: 线程安全的字符串常量 如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法。
  • StringBuilder:线程不安全的字符串常量,效率比StringBuffer高。

使用场景

  1. 如果使用少量的,不需要做多次修改的数据,可以使用String。
  2. 如果需要较多次对数据进行修改,而且是在多个线程在操作,例如全局变量,则选用StringBuffer。
  3. 如果是在单线程中多次对数据进行修改,使用StringBuilder。
  4. 在大量使用“+”处理字符串时,尽可能使用StringBuffe或者StringBuilderr来处理,这样性能较好。
String a = "1" + "1" + "1";
StringBuffer sb = new StringBuffer("1").append(1).append(1);

由于 "1" + "1" + "1" = “111”是在编译时就确定下来的,所以运行所需时长,String与StringBuffer差不多。此外如果在编译时不能够确定,例如对String对象相加:

        String a = "1";
        String b = "2";
        String c = "3";
        String abc = a + b +c;
        StringBuffer sb = new StringBuffer("1").append(2).append(3);

这个时候String类中“+”需要使用StringBuilder的append方法来实现,所以就需要将新建一个StringBuilder对象,然后调用其append方法,最后调用toString方法。因为这是在同一个StringBuilder对象中进行的,所以性能上没有太大的差异。
但是如果是在循环中多次使用“+”的话,就会造成性能大量损失。

String test = "";
for (String s : testArray) {
    test = test + s;
}

循环中每次使用“+”,都新建了一个StringBuilder对象,调用了toString方法。

你可能感兴趣的:(String、StringBuffer、StringBuilder区别)