String 对象是不可变对象(显然线程安全),String 对象一旦创建之后就不可更改了。Java 中对 String 对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
StringBuffer 线程安全的可变字符序列:对 StringBuffer对象本身进行操作,而不是生成新的对象。
StringBuilder 线程不安全的可变字符序列:提供一个与 StringBuffer 兼容的API,但不同步。设计作为 StringBuffer 的一个简易替换,用在字符缓冲区被单个线程使用的时候,效率比StringBuffer更快。
总结:
- 在字符串不经常发生变化的业务场景优先使用String(代码更清晰简洁)。如常量的声明,少量的字符串操作(拼接,删除等)。
- 在单线程情况下,如有大量的字符串操作情况,应该使用StringBuilder来操作字符串。不能使用String"+"来拼接而是使用,避免产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。
- 在多线程情况下,如有大量的字符串操作情况,应该使用StringBuffer。
- 执行速度:StringBuilder > StringBuffer > String