定义
- String: 字符串常量,String类是不可变类,因此每次修改String对象时,都要新建一个String对象,造成性能的浪费。
- StringBuffer: 线程安全的字符串常量 如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法。
- StringBuilder:线程不安全的字符串常量,效率比StringBuffer高。
使用场景
- 如果使用少量的,不需要做多次修改的数据,可以使用String。
- 如果需要较多次对数据进行修改,而且是在多个线程在操作,例如全局变量,则选用StringBuffer。
- 如果是在单线程中多次对数据进行修改,使用StringBuilder。
- 在大量使用“+”处理字符串时,尽可能使用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方法。