百度一下区别。

一、知识点

(1)String

String的局限性在于不可修改,是不可变的对象。因此,在每次对String 类型进行改变的时候,都生成了一个新的String对象,然后将指针指向它,这就形成了“string改变了”这样的错觉。

所以,经常改变内容的字符串最好不要用String,因为每次改变都会生成对象,对系统性能产生一点影响。当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,对应用会有影响。

(2)Stringbuffer

Java.lang.StringBuffer是线程安全的可变字符序列。一个类似于String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

Stringbuffer可以安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

在多线程中,如有线程安全的必要,可以使用StringBuffer。

(3)StringBuilder

如果可能,建议优先采用该类。因为在大多数实现中,它比StringBuffer要快。但是将StringBuilder的实例用于多个线程是不安全的。

如果需要这样的同步,则建议使用StringBuffer。

StringBuilder类可以在“无需创建一个新的字符串对象的情况下”修改字符串。

StringBuilder不是线程安全的,StringBuffer是线程安全的。但是StringBuilder在单线程中的性能比StringBuffer更好。所以单线程中,请使用StringBuilder。

二、总结

最新的解读可见:

http://www.xie4ever.com/2017/05/12/java-string-%E5%92%8C-stringbuilder-%E5%92%8C-stringbuffer/

给出了更详细的对比。