区别算法
一、StringBuffer 与 StringBuilder 中的方法和功能彻底是等价的,安全
二、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,所以是线程安全的,多线程
而 StringBuilder 没有这个修饰,能够被认为是线程不安全的。 app
三、在单线程程序下,StringBuilder效率更快,由于它不须要加锁,不具有多线程安全jvm
而StringBuffer则每次都须要判断锁,效率相对更低ui
实现原理spa
StringBuffer类继承自AbstractStringBuilder抽象类,实现Serializable序列化接口和CharSequence接口。线程
AbstractStringBuilder抽象类实现Appendabel,CharSequence接口。对象
StringBuffer初始化及扩容机制blog
1.StringBuffer()的初始容量能够容纳16个字符,当该对象的实体存放的字符的长度大于16时,实体容量就自动增长。StringBuffer对象能够经过length()方法获取实体中存放的字符序列长度,经过capacity()方法来获取当前实体的实际容量。
2.StringBuffer(int size)能够指定分配给该对象的实体的初始容量参数为参数size指定的字符个数。当该对象的实体存放的字符序列的长度大于size个字符时,实体的容量就自动的增长。以便存放所增长的字符。
3.StringBuffer(String s)能够指定给对象的实体的初始容量为参数字符串s的长度额外再加16个字符。当该对象的实体存放的字符序列长度大于size个字符时,实体的容量自动的增长,以便存放所增长的字符。
JVM StringBuffer实现
JVM内部采用了StringBuffer来链接字符串了,那么咱们本身就不用用StringBuffer,直接用”+“就好了吧!“。是么?固然不是了。俗话说”存在既有它的理由”,让咱们继续看后面的循环对应的字节码。
由于每次执行“+”操做时jvm都要new一个StringBuffer对象来处理字符串的链接,这在涉及不少的字符串链接操做时开销会很大。