本文介绍: 但是这俩个我们推荐使用哪个呢,在正常情况下呢我们推荐使用StringBuilder来进行对我们字符串修改,因为它的效率比较高,但是StringBuilder线程安全的,在特殊的情况下还是得有StringBuffer,StringBudder它是线程安全的。这里才是我们真正将数据存放builder中的操作我们上面知道创建时候char[]的时候直接是将长度扩展到16,但是如果长度超过16又是如何处理的呢,我们来看一下原理

 首先这俩个类都是可变序列,与String不同String类是不可变序列,StringBuffer和StringBuilder

他们是将数据存储char value[] 待会会给大家看一下源码,这俩个类相当于是String类的升级版,它可以我们字符串操作更加的便捷,也提供了很多便捷的方法比如

  1. append(): 在字符串末尾添加新的字符串
  2. insert(): 在指定位置插入新的字符串
  3. delete(): 删除指定范围内的字符
  4. deleteCharAt(): 删除指定位置字符
  5. replace(): 替换指定范围内的字符
  6. substring(): 截取指定范围内的字符
  7. capacity(): 返回当前容量。
  8. length(): 返回当前长度
  9. setCharAt(): 设置指定位置字符
  10. 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一下。

原文地址:https://blog.csdn.net/m0_62066720/article/details/134818465

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_48058.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注