String、StringBuilder、StringBuffer
共同点:底层都是使用一个char类型的数组保存元素(叫value)
1.可变与不可变
string 对象是不可变的; StringBuilder 与 StringBuffer 对象是可变的。
因此在每次对 String 类型进行改变的时候, 都会生成一个新的 String 对象, 然后将指针指向新的 String 对象, 所以经常改变内容的字符串最好不要用 String , 因为每次生成对象都会对系统性能产生影响, 特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作, 性能就会降低。
2.是否多线程安全
StringBuffer是线程安全的,因为它的许多方法如append都是使用synchronized修饰的。String是final类型的,所以也是安全的。StringBuilder是线程不安全的。
速度StringBuilder>StringBuffer>String
3.初始化方式的不同
StringBuffer 和 StringBuilder 只能用构造函数的形式来初始化。String 除了用构造函数进行初始化外, 还可以直接赋值。
StringBuilder和StringBuffer的父类都是AbstractStringBuilder,两者的append方法都是使用父类的append方法,append方法中有扩容,所以两者的扩容机制也一样。append也是使用system.arraycopy(native方法)复制数组。但是不是用synchronized 修饰。