zoukankan      html  css  js  c++  java
  • 走进JDK(三)------AbstractStringBuilder、StringBuffer、StringBuilder

    AbstractStringBuilder是一个抽象类,StringBuffer、StringBuilder则继承AbstractStringBuilder,所以先说AbstractStringBuilder。

    AbstractStringBuilder

    一、AbstractStringBuilder

    //实现了两个接口,其中CharSequence这个字符序列的接口已经很熟悉了:
    //1、该接口规定了需要实现该字符序列的长度:length();
    //可以取得下标为index的的字符:charAt(int index);
    //可以得到该字符序列的一个子字符序列: subSequence(int start, int end);
    //规定了该字符序列的String版本(重写了父类Object的toString()):toString();
    //2、Appendable接口顾名思义,定义添加的’规则’:
    //append(CharSequence csq) throws IOException:如何添加一个字符序列
    //append(CharSequence csq, int start, int end) throws IOException:如何添加一个字符序列的一部分
    //append(char c) throws IOException:如何添加一个字符
    abstract class AbstractStringBuilder implements Appendable, CharSequence

    二、成员变量

    //底层是一个char[],存储数据
    char[] value;
    //实际存储的数量
    int count;

    三、构造函数

    AbstractStringBuilder() {
        }
    
        AbstractStringBuilder(int capacity) {
            value = new char[capacity];
        }

    四、主要方法

    1、容量相

    //返回已经存储的实际长度
    public int length() {
            return count;
        }
    //得到目前该value数组的实际大小
    public int capacity() {
            return value.length;
        }
    //minimumCapacity所需的最小容量
    public void ensureCapacity(int minimumCapacity) {
            if (minimumCapacity > 0)
                ensureCapacityInternal(minimumCapacity);
        }
    //当所需容量大于当前value的长度时,通过Arrays.copyOf创建新大小的数组
    private void ensureCapacityInternal(int minimumCapacity) {
         if (minimumCapacity - value.length > 0) {
             value = Arrays.copyOf(value,
                 newCapacity(minimumCapacity));
            }
        }
    //如果value数组的容量有多余的,那么就把多余的全部都释放掉
    public void trimToSize() {
            if (count < value.length) {
                value = Arrays.copyOf(value, count);
            }
        }

    2、append

    //AbstractStringBuilder提供了很多append()方法,选择重要的说
    public AbstractStringBuilder append(String str) {
            if (str == null)
                return appendNull();
            int len = str.length();
            ensureCapacityInternal(count + len);
            str.getChars(0, len, value, count);
            count += len;
            return this;
        }

    另外还有delete()、replace()、insert()等方法。使用场景不多,加上源码不难,有需要的时候可以自行查看。

    StringBuilder

    一、类定义

    public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence

    二、构造函数

        public StringBuilder() {
            super(16);
        }
    
        public StringBuilder(int capacity) {
            super(capacity);
        }
    
        public StringBuilder(String str) {
            super(str.length() + 16);
            append(str);
        }
    
        public StringBuilder(CharSequence seq) {
            this(seq.length() + 16);
            append(seq);
        }

    这也是为啥先学习AbstractStringBuilder的原因,大部分都是调用父类方法。

    三、主要方法

    对于常见的crud方法,都是使用的父类的相关方法操作。另外StringBuilder有两个private的方法

        private void writeObject(java.io.ObjectOutputStream s)
            throws java.io.IOException {
            s.defaultWriteObject();
            s.writeInt(count);
            s.writeObject(value);
        }
    
        private void readObject(java.io.ObjectInputStream s)
            throws java.io.IOException, ClassNotFoundException {
            s.defaultReadObject();
            count = s.readInt();
            value = (char[]) s.readObject();
        }

    这也就是StringBuilder的序列化以及反序列化。

    StringBuffer

    一、类定义

    public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence

    其他方法StringBuffer与StringBuilder基本一致,只是多了个synchronized关键字,用来保证线程安全,但是效率相对低一些。

  • 相关阅读:
    New starting
    Ubuntu中PyCharm中字体设置
    pyshp操作shapefile
    GIS的数学基础
    向mysql中插入Date类型的数据
    mysql多字段排序
    干掉命令行窗口下MySql乱码
    JavaWeb中读取文件资源的路径问题
    Java中9种IO的读取方式
    JavaIO 将数据写入到文件中去
  • 原文地址:https://www.cnblogs.com/alimayun/p/10686497.html
Copyright © 2011-2022 走看看