首先这俩个类都是可变序列,与String类不同String类是不可变序列,StringBuffer和StringBuilder
他们是将数据存储在char value[] 待会会给大家看一下源码,这俩个类相当于是String类的升级版,它可以让我们对字符串的操作更加的便捷,也提供了很多便捷的方法比如
- append(): 在字符串末尾添加新的字符串。
- insert(): 在指定位置插入新的字符串。
- delete(): 删除指定范围内的字符。
- deleteCharAt(): 删除指定位置的字符。
- replace(): 替换指定范围内的字符。
- substring(): 截取指定范围内的字符。
- capacity(): 返回当前容量。
- length(): 返回当前长度。
- setCharAt(): 设置指定位置的字符。
- indexOf(): 返回指定字符串第一次出现的位置
但是这俩个我们推荐使用哪个呢,在正常情况下呢我们推荐使用StringBuilder来进行对我们字符串的修改,因为它的效率会比较高,但是StringBuilder是线程不安全的,在特殊的情况下还是得有StringBuffer,StringBudder它是线程安全的。
我们先来看一下这两者的体系图:
我们再来看一下它们的源码并进行简单的分析:
这里我们发现StringBuilder可以添加多种数据类型,通过方法重载的方式来进行判断,接下来我们看看它是如何将数据添加进去的:
这里我们可以发现当我们第一次创建StringBuilder的时候就会初始化char[]的长度为16;
当我们执行到append方法的时候发现我们添加数据是调用的super.append()
这里才是我们真正将数据存放进builder中的操作,我们上面知道刚创建的时候char[]的时候是直接是将长度扩展到16,但是如果长度超过16又是如何处理的呢,我们来看一下原理
这里我们发现count已经为3,又存储了一个17长度字符串,长度以及超过16接下来我们看一下如何扩容
这里就是我们扩容的代码逻辑,这里是通过if判断来进行是否需要扩容的判断,这里的minimumCapacity的值为20所以大于0进行扩容
通过copyof()方法来进行真正的扩容我们发现新的容量为原容量的2倍加2这就是StringBuilder的扩容原理。
StringBuffer跟StringBuilder的原理很像基本上都是一模一样的,所以这里大家有兴趣可以去DeBug一下。