String、StringBuffer和StringBuilder的区别是什么?
重要内容
- String:不可变字符序列,效率低,但是因为存在常量池所以复用率高,String 不可变,因此是线程安全的
- StringBuffer:可变字符序列,效率较高(增删),线程安全
- StringBuilder:可变字符序列,效率最高,线程不安全
扩展内容
Java8中的优化
在Java8及以后,编译器会对字符串的常量拼接做优化,将字符串拼接转换为StringBuilder操作。这种优化提高了代码性能,但是在动态拼接或多线程场景下,手动使用StringBuilder和StringBuffer仍然更合适
String 和StringBuffer 的相互转换
public static void main(String[] args) {
// String和StringBuffer的相互转换
// String => StringBuffer
String str = "lns";
StringBuffer stringBuffer = new StringBuffer(str); // 方式一: 使用StringBuffer构造器
StringBuffer append = new StringBuffer().append(str); // 方式二: 使用的是append方法
// StringBuffer => String
StringBuffer sbr = new StringBuffer("zlr");
String s = sbr.toString(); // 方式一: 使用toString方法
String s1 = new String(sbr); // 方式二:使用String构造器
}
使用原则
- 如果字符串存在大量的修改操作,一般使用StringBuffer或者StringBuider
- 如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder
- 如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer
- 如果字符串很少修改,被多个对象引用,使用String,比如:配置信息等