四个方面:不可变性、线程安全、性能、使用场景
String:不可变,线程安全,适用于多线程编程。
注意:由于String内部字符数组由final修饰,对其进行改变时会创建新的String对象,旧的会被JVM回收,容易触发gc(垃圾回收),这种行为可能会导致频繁的内存分配和垃圾回收,从而引起系统的内存抖动(memory churn)
StringBuilder:可变,线程不安全,适用于单线程下数据库更新。多线程环境下容易导致数据不一致(脏读、幻读等)
StringBuffer:可变,线程安全,适用于多线程下更新。单线程下性能不如StringBuilder
总结:StringBuilder和StringBuffer都优于String,避免了内存抖动。不过要根据实际情况选择:
-
常量声明和少量字符串操作,用String
-
需要频繁对字符串进行操作(如拼接、复制等),单线程用StringBuilder,多线程用StringBuffer