StringBuffer和StringBuilder都是可变的字符序列
String,StringBuffer和StringBuilder有哪些异同? 差异:String 是不可变字符序列
StringBuffer和StringBuilder都是可变字符序列
那么StringBuffer和StringBuilder又有什么区别呐?
StringBuffer是线程安全的,但是效率就偏低
- 为什么我们说StringBuffer是线程安全的?
- 因为StringBuffer中的方法是由synchronized修饰的,也就表示是同步方法,
被synchronized修饰的代码块表示是同步代码块
被synchronized修饰的方法表示是同步方法
StringBuilder是线程不安全的,效率高
相同点:String, StringBuffer,和StringBuilder在底层都是通过char[]进行存储的
那么我什么时候使用StringBuffer,什么时候使用StringBuilder如果一个问题都不涉及多线程,那么这个时候我们也就不需要考虑线程安全,我们这个时候应该使用StringBuilder
- StringBuffer和StringBuilder都是可变字符序列,它们调用一个修改字符串的方法可以不用接收返回值,因为它们是将原有的字符串对象进行了修改
- 但是String是不可变字符序列,它们调用一个修改字符串的方法一般都必须要接收返回值,因为String改变不是对原有的字符串对象进行了修改,而是创建了一个新的字符串对象并且将这个新的字符串对象返回了
- 其实都是产生了一个返回了改变后一个字符串,只不过StringBuffer和StringBuilder都是在原有的字符串上进行了修改,而String是会产生一个新的字符串,然后这个新的字符串赋上我们需要的值
- StringBuffer和StringBuilder都是继承与同一个父类:AbstractStringBuilder
- 我们使用StringBuffer中的append()方法会在StringBuffer对象的尾部追加一个内容,这个时候如果我们要追加的内容超出了StringBuffer底层的value[]的容量的话,那么这个时候我们就会自动进行扩容,这个时候我们进行扩容时就会创建出一个新的value[],然后让这个新产生的value[]来代替这个原本的value[],但是原本的StringBuffer对象并没有变
- 也就是我们的StringBuffer对象进行扩容时,底层value[]会发生改变,但是StringBuffer对象一定不会变
- StringBuffer(StringBuilder)----String
- 我们可以调用String的构造方法,然后将StringBuffer对象作为实参传入构造方法中,就可以将StringBuffer转换为String了


![StringBuffer和StringBuilder的概述 [Java] StringBuffer和StringBuilder的概述 [Java]](http://www.mshxw.com/aiimages/31/683306.png)
