加入收藏 | 设为首页 | 会员中心 | 我要投稿 驾考网 (https://www.jiakaowang.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

StringBuilder/StringBuffer源码阅读流程

发布时间:2023-03-13 13:49:33 所属栏目:教程 来源:
导读:在 Java String类源码阅读笔记 里学习了String类的源码,StringBuilder、StringBuffer是经常拿来和String类做对比的两个类,可谓是“爱恨纠缠” ,这里我们继续学习这两个类的源码。

StringBuilder/Str
在 Java String类源码阅读笔记 里学习了String类的源码,StringBuilder、StringBuffer是经常拿来和String类做对比的两个类,可谓是“爱恨纠缠” ,这里我们继续学习这两个类的源码。

StringBuilder/StringBuffer继承关系
StringBuilder、StringBuilder具有相同的继承关系,都继承自AbstractStringBuilder类,实现了CharSequence接
口。

AbstractStringBuilder
这里我们先看一下AbstractStringBuilder这个类,StringBuilder、StringBuffer中的很多方法都是调用它们的父类。

属性
//用作字符存储的数组
char[] value;
//字符数组的字符个数
int count;

构造方法
无参
    AbstractStringBuilder() {
    }
有参
  //为字符数组指定容量
 AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

length()
  //返回字符个数
    @Override
    public int length() {
        return count;
    }

capacity()
    //返回AbstractStringBuilder的容量(数组的容量)
    public int capacity() {
        return value.length;
    }

扩容
   /**
   *  私有方法,扩容,扩大value数组容量,并拷贝数组元素
   */
    private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscIoUs code
        if (minimumCapacity - value.length > 0) {
            value = Arrays.copyOf(value,newCapacity(minimumCapacity));
        }
    }
    //调用私有扩容方法
     public void ensureCapacity(int minimumCapacity) {
        if (minimumCapacity > 0)
            ensureCapacityInternal(minimumCapacity);
    }

拼接
   /**
   * 私有方法,追加字符串
   */
    public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        //将value数组扩容
        ensureCapacityInternal(count + len);
        //调用Stirng类的getChars方法将str追加到末尾
        str.getChars(0,len,value,count);
        count += len;
        //返回自身
        return this;
    }
   //调用私有扩容方法
    public AbstractStringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }
     
除了拼接字符串,AbstractStringBuilder还实现了拼接字符数组,基本数据类型等。

StringBuilder
在StringBuilder中,绝大部分的方法都是直接调用父类AbstractStringBuilder类的方法。

例如:

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
StringBuffer
属性
 // toString返回的最后一个值的缓存。 每当修改StringBuffer时清除。
 private transient char[] toStringCache;

方法
和StringBuilder类似,StringBuffer大部分方法也都是直接调用父类AbstractStringBuilder类的方法的方法。

不同的是,StringBuffer是线程安全的。是因为 StringBuffer 类的 大部分方法都被 synchronized 修饰。

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }



 

(编辑:驾考网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章