回答重点
他们都是Java中处理字符串的类,区别主要体现在可变性、线程安全和性能上
1)String
- 不可变:String是不可变类,字符串对象创建,存储在堆中,字符串内容存储在字符串常量池中,一旦创建内容无法更改。每次对String进行修改操作(如拼接、截取等),都会创建新的字符串常量池对象
- 适合场景:String适合于字符串内容不会频繁变化的场景
2)StringBuffer
- 可变:StringBuffer是可变的,因为底层是字符数组,(字符是局部变量存栈上,跟着方法一起的生命周期,如果是成员变量存在堆中,跟着对象)任何操作都是对数组操作,而不是创建新的对象,可以进行字符串的追加、删除、插入等操作
- 线程安全:StringBuffer是线程安全的,内部使用了synchronized关键字保证多线程环境下的安全性
- 适合场景:适用于多线程环境中需要频繁修改字符串的场景
3)StringBuilder
- 可变:也是可变的,提供了与StringBuffer类似的操作方法
- 非线程安全:线程不安全
- 性能:由于少了同步的操作,性能开销比StringBuffer小
- 适合场景:适用于单线程环境中需要大量修改字符串的场景