StringBuilder/StringBuffer源码阅读笔记

编程之家收集整理的这篇文章主要介绍了StringBuilder/StringBuffer源码阅读笔记编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

本文基于jdk1.8。


StringBuilder/StringBuffer继承关系

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

StringBuilder继承关系

在这里插入图片描述

StringBuffer继承关系

在这里插入图片描述




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;
    }



参考:

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

总结

以上是编程之家为你收集整理的StringBuilder/StringBuffer源码阅读笔记全部内容,希望文章能够帮你解决StringBuilder/StringBuffer源码阅读笔记所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢寻找一群志同道合、互帮互助的学习伙伴,可以点击下方链接加入:
编程之家官方1群
编程之家官方2群
编程之家官方3群
编程之家官方4群

相关文章

猜你在找的Java SE相关文章

@ 注解能被用来为程序元素( 类、 方法、 成员变量等) 设置元数据。 值得指出的是, 注解不影响程序代码的执行, 无论增加、 删除注解, 代码都始终如一地执行。 如果希望让程序中的注解在运行时起一定
@ 1、线性表的概念 线性表是最常见也是最简单的一种数据结构。简言之, 线性表是n个数据元素的有限序列。 其一般描述为: A={a1,a2,……an) 一个数据元素通常包含多个数据项, 此时每个数据元
在 Java String类源码阅读笔记 里学习了String类的源码,StringBuilder、StringBuffer是经常拿来和String类做对比的两个类,可谓是“爱恨纠缠” ,这里我们继续
话不多说,先上图。 1、基本概念 欲说线程,必先说进程。 进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进
JVM是面试中必问的部分,本文通过思维导图以面向面试的角度整理JVM中不可不知的知识。 先上图: 1、JVM基本概念 1.1、JVM是什么 JVM 的全称是 「Java Virtual Machine
@ 本文基于jdk1.8 HashMap采用 key/value 存储结构,每个key对应唯一的value。 在jdk1.7之前,HashMap 的内部存储结构是数组+链表。 在jdk1.8中 Has
@ 准备 LinkedList是基于双向链表数据结构实现的Java集合(jdk1.8以前基于双向循环链表),在阅读源码之前,有必要简单了解一下链表。 先了解一下链表的概念:链表是由一系列非连续的节点组
@ 写博客哪有刷逼乎有意思 1 写博客哪有刷逼乎有意思 2 写博客哪有刷逼乎有意思 3 类的加载、 连接和初始化 系统可能在第一次使用某个类时加载该类, 也可能采用预加载机制来加载某个类。 JVM 和
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注