String:典型的immutable类,被声明为final class,所有属性也都是final的。不可变对象的优先是被多线程访问的时候不需要锁和等待的时间。
StringBuffer:是为解决String拼接产生太多中间对象而设计的,可以用append或add把字符串添加到指定位置。它是一个线程安全的可修改字符串,把各种修改数据的方法都加上了synchronize关键字,有性能开销;
StringBuilder:非线程安全版本的StringBuffer。
StringBuffer和StringBuilder底层都是使用了可修改数组。
String因为使用过于频繁,java为了避免在一个系统中使用大量的String对象,引入了字符串常量池,当通过直接量给String对象引用赋值的时候,会先检查常量池中是否有值相同的字符串对象,没有的话再创建并丢到常量池里面。但是通过new创建的不会去常量池查找,通常是在堆区或者栈区创建一个对象。
String str1 = "123"; //通过直接量赋值方式,放入字符串常量池 String str2 = new String(“123”);//通过new方式赋值方式,不放入字符串常量池
StringBuffer/StringBuilder会申请一个char数组,当加入的新数据超过默认大小后,会创建一个新的数组,并把原来的数组的内容搬移过去。