浅谈StringBuffer和StringBuilder

StringBuffer和StringBuilder

字符串是我们最常用的类,我们每天都在用,我们都知道String类是一个不可变的字符串
,我们在编写代码的时候有时候需要用到字符串拼接,在拼接的时候都会创建新的字符串对象,效率慢不说而且还浪费内存,严重的时候可能出现OutOfMemoryError,内存溢出。
java推荐我们在大量字符串拼接的时候使用StringBuffer或StringBuilder这两个类,它们可以重用字符串进行字符串拼接,它们都继承了AbstractStringBuilder类所以它们的内部大有些地方实现很相似。
首先我们来看看它们的构造器

StringBuffer

在这里插入图片描述
在这里插入图片描述

StringBuilder

在这里插入图片描述
在这里插入图片描述

从上面可以看出默认的容量是16,在传递值得情况下是在本来的字符串长度基础上+16

我们来了解一下这个方法Arrays.copyOf(boolean[] original, int newLength) ,这个方法可以将数组复制到新的一个数组实现了数组的扩容,System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 这个方法可以将指定数组内容复制给另一个数组,这个方法可以实现数组的缩容,我们来看看StringBuilder类的append()方法怎样实现的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们可以看到在拼接字符串的时候首先判断传进来的是不是null如果是会拼接一个字符串的null出来,如果不是null的话会和原来的数组长度也就是你传进来的原来的字符串长度进行相加,也就是count + len,count记录的是当时传入字符串长度,当超过原始长度16时他会发生扩容,扩容机制为1倍+2,扩容时候使用Arrays.copyOf()这个方法,由于这个方法扩容后会出现很多空位置,所以又调用了System.arraycopy()这个方法
由上面的方法可以看出他们用数组的扩容机制来实现数组的重用,但是也是有一定问题的。

StringBuilder的线程安全问题

当多线程访问StringBuilder的时候很容易就出现线程安全问题,怎么办呢?
这时候StringBuffer就登场了我们来看看它的源代码在这里插入图片描述
synchronized可以保证线程安全StringBuffer类的几乎所有方法都加上了synchronized大大保证了线程安全,但是也有问题,StringBuffer的速度没有StringBuilder快

StringBuilder和StringBuffer的区别

StringBuilder
  1. 线程不安全
  2. 版本1.5
  3. 速度快
StringBuffer
  1. 线程安全
  2. 版本1.0
  3. 速度慢

这些就是我对StringBuffer和StringBuilder的理解欢迎大神指点

猜你喜欢

转载自blog.csdn.net/weixin_45118251/article/details/90550007
今日推荐