String 为什么是不可变的?
String s = new String("xyz"); 会创建几个对象?
1个或2个。
- 字符串常量池中不存在字符串对象 “xyz” 的引用。
字符串常量池中创建 1 个 String 对象 -> 堆空间中创建 1 个 String 对象(共 2 个)。
- 字符串常量池中已存在字符串对象 “xyz” 的引用。
堆空间中创建 1 个 String 对象(共 1 个)。
String、StringBuffer 和 StringBuilder 的区别?
可变性
String 是不可变的;
StringBuffer 和 StringBuilder 是可变的。StringBuffer 和 StringBuilder 都继承自 AbstractStringBuilder 类,AbstractStringBuilder 类内部使用 byte[] 保存字符串,该 byte[] 并未被 private 和 final 关键字修饰,且该类提供了很多操作字符串的方法(如 append() )。
线程安全性
String 是线程安全的。String 是不可变的。
StringBuffer 是线程安全的。StringBuffer 对 AbstractStringBuilder 类提供的操作字符串的方法加了同步锁。
StringBuilder 是非线程安全的。
性能
String < StringBuffer < StringBuilder // 线程安全
总结
String 适用于数据量少的场景;
StringBuffer 适用于多线程、数据量多的场景;
StringBuilder 适用于单线程、数据量多的场景。