String是Java中基础且重要的类,并且String也是Immutable类的典型实现,被声明为final class,除了hash这个属性其它属性都声明为final,因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。
StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上了synchronized。但是保证了线程安全是需要性能的代价的。
在很多情况下我们的字符串拼接操作不需要线程安全,这时候StringBuilder登场了,StringBuilder是JDK1.5发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。
StringBuffer 和 StringBuilder 二者都继承了 AbstractStringBuilder ,底层都是利用可修改的char数组(JDK 9 以后是 byte数组)。
所以如果我们有大量的字符串拼接,如果能预知大小的话最好在new StringBuffer 或者StringBuilder 的时候设置好capacity,避免多次扩容的开销。扩容要抛弃原有数组,还要进行数组拷贝创建新的数组
String是一个不可变的字符序列,字符串常量
StringBuffer是一个可变的字符序列 ,字符串变量(线程安全)
StringBuilder 是一个可变的字符序列 ,字符串变量(非线程安全)
String对象值的修改都是重新创建一个新的对象,然后把新的值保存进去
StringBuffer类对象,每次返回的都是原对象,可以通过append()方法来修改值
String对象底层重写了hascode和equals
StringBuffer对象底层未重写了hascode和equals
StringBuffer性能比String高
StringBuffer是线程安全的
无参构造方法,Sting为空字符初始容量为0,StringBuffer初始容量为16
StringBuffer和StringBuilder的区别
StringBuffer 线程安全 同步的 速度慢
StringBuilder 线程不安全 非同步的 速度快
在java中有4个类来负责字符的操作。
- 1.Character 是进行单个字符操作的,
- 2.String 对一串字符进行操作,不可变类。
- 3.StringBuffer 对一串字符操作,可变类
- 4.StringBuilder 对一串字符操作,可变类
1.可变与不可变