这篇文章主要介绍Java之弦,StringBuffer和StringBuilder的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
字符串对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空间来存储修改之后的对象,即修改了字符串的引用。
因为字符串的底层是用数组来存值的,数组长度不可改变这一特性导致了上述问题。
?如果我们在实际开发过程中需要对某个字符串进行频繁的修改,使用字符串就会造成内存空间的浪费,应该怎样解决这个问题呢? ?
答案就是可以使用StringBuffer来解决这个问题。
<强>下面我们就来详细谈谈StringBuffer: 强>
?StringBuffer和字符串类似,底层也是用一个数组来存储字符串的值,并且数组的默认长度为16,即一个空的StringBuffer对
象、数组长度为16。实例化一个StringBuffer对象即创建了一个大小为16个字符的字符串缓冲区。
但是当我们调用有参构造函数创建一个StringBuffer对象时,数组长度就不再是16了,而是根据当前对象的值来决定数组的长
度,数组的长度为“当前对象的值的长度+ 16”。
所以一个StringBuffer创建完成之后,有16个字符的空间可以对其值进行修改。如果修改的值范围超出了16个字符,会先检查
StringBuffer对象的原字符数组的容量能不能装下新的字符串,如果装不下则会对字符数组进行扩容。
<强>那StringBuffer是怎样进行扩容的呢? 强>
扩容的逻辑就是创建一个新的字符数组,将现有容量扩大一倍再加2上,如果还是不够大则直接等于需要的容量大小。扩容
完成之后,将原数组的内容复制到新数组,最后将指针指向新的字符数组。
<强>接下来看StringBuffer的兄弟——StringBuilder 强>
StringBuilder和StringBuffer拥有同一个父类AbstractStringBuilder,同时实现的接口也是完全一样,都实现了
. io .可序列化的,CharSequence进行两个接口。
<强>那它俩有什么区别呢? 强>
最大的区别在于StringBuffer对几乎所有的方法都实现了同步,线程比较安全,在多线程系统中可以保证数据同步;
而StringBuilder没有实现同步,线程不安全,在多线程系统中不能使用StringBuilder。
<强> StringBuffer和StringBuilder的使用场景:强>
当需要考虑线程安全的场景下使用StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用StringBuilder。
以上是Java之弦,StringBuffer和StringBuilder的区别有哪些的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!