• 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源码分析

  • 相关阅读:
    【javascript】手写call,apply,bind函数
    http压缩 Content-Encoding: gzip
    【javascript】强大的CSS3/JS:帧动画的多种实现方式与性能对比
    【canvas】html5 canvas常用api总结(二)--图像变换API
    【canvas】html5 canvas常用api总结(一)--绘图API
    python的列表试用3-6
    UIImagePickerController获取照片的实现,添加overlay方法 (相机取景框)
    调试JDK1.8源码的方法
    多线程-Executor,Executors,ExecutorService,ScheduledExecutorService,AbstractExecutorService
    多线程-Fork/Join
  • 原文地址:https://www.cnblogs.com/three-fighter/p/13732495.html
Copyright © 2020-2023  润新知