StringBuffer与StringBuilder的区别,及实现原理

区别算法

一、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个字符时,实体的容量自动的增长,以便存放所增长的字符。

 

扩容算法:
使用append()方法在字符串后面追加东西的时候,若是长度超过了该字符串存储空间大小了就须要进行扩容:构建新的存储空间更大的字符串,将久的复制过去;
 
再进行字符串append添加的时候,会先计算添加后字符串大小,传入一个方法:ensureCapacityInternal 这个方法进行是否扩容的判断,须要扩容就调用expandCapacity方法进行扩容
尝试将新容量扩为大小变成2倍+2   if 判断一下 容量若是不够,直接扩充到须要的容量大小。

JVM StringBuffer实现

 JVM内部采用了StringBuffer来链接字符串了,那么咱们本身就不用用StringBuffer,直接用”+“就好了吧!“。是么?固然不是了。俗话说”存在既有它的理由”,让咱们继续看后面的循环对应的字节码。

由于每次执行“+”操做时jvm都要new一个StringBuffer对象来处理字符串的链接,这在涉及不少的字符串链接操做时开销会很大。

相关文章
相关标签/搜索