前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >StringBuilder/StringBuffer源码阅读笔记

StringBuilder/StringBuffer源码阅读笔记

作者头像
三分恶
发布2020-09-28 11:08:16
4090
发布2020-09-28 11:08:16
举报
文章被收录于专栏:三分恶的专栏三分恶的专栏

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

本文基于jdk1.8。

StringBuilder/StringBuffer继承关系

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

StringBuilder继承关系

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

StringBuffer继承关系

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

AbstractStringBuilder

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

属性

代码语言:javascript
复制
//用作字符存储的数组
char[] value;
//字符数组的字符个数
int count;

构造方法

  • 无参
代码语言:javascript
复制
    AbstractStringBuilder() {
    }
  • 有参
代码语言:javascript
复制
  //为字符数组指定容量
 AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

length()

代码语言:javascript
复制
  //返回字符个数
    @Override
    public int length() {
        return count;
    }

capacity()

代码语言:javascript
复制
    //返回AbstractStringBuilder的容量(数组的容量)
    public int capacity() {
        return value.length;
    }

扩容

代码语言:javascript
复制
   /**
   *  私有方法,扩容,扩大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);
    }

拼接

代码语言:javascript
复制
   /**
   * 私有方法,追加字符串
   */
    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类的方法。

例如:

代码语言:javascript
复制
    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

StringBuffer

属性

代码语言:javascript
复制
 // toString返回的最后一个值的缓存。 每当修改StringBuffer时清除。
 private transient char[] toStringCache;

方法

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

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

例如:

代码语言:javascript
复制
    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

参考:

【1】:String源码分析 【2】:Java StringBuilder和StringBuffer源码分析

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • StringBuilder/StringBuffer继承关系
  • AbstractStringBuilder
    • 属性
      • 构造方法
        • length()
          • capacity()
            • 扩容
              • 拼接
              • StringBuilder
                • StringBuffer
                  • 属性
                    • 方法
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档