在java中,String 的对象是不可变的,也就是可以理解为常量,一点被赋值,便不能更改其指向的字符对象,如果更改,便会指向一个新的字符对象。而StringBufffer是一个具有对象引用的传递特点的字符串对象,他并没有对方法进行同步锁或者对调用的方法加同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。如果程序不是多线程的,那么使用StringBuilder效果率高于StringBuffer。
StringBuffer与StringBuffer有共同的父类AbstractStringBuilder(抽象类)。子类只需要增加新的功能,而不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。他们都会调用AbstractStringBuilder中的公共方法,如super.append()。但是在StringBuffer前需要加上synchronized关键字,进行同步。StringBuilder是单个线程使用的StringBuffer等价类,一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。
在 StringBuilder 上的主要操作是 append 和 insert 方法, append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。