AbstarctStringBuilder基于jdk1.8源码解析

AbstratrcStringBuilder是Stringbuffer与StringBuilder的父类 ,从它的的类修饰词中我们能够看出这个类是一个抽象类

abstract class AbstractStringBuilder implements Appendable, CharSequence {  //注意到这是一个用Abstarct抽象词修饰的一个类
   
//关于他其中的属性
    char[] value;   //它是一个字节数组  
    
    
    int count;  //显示被调用到的次数
    
//关于它其中的有参构造方法
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

//其他的方法
public int capacity() {
    //只是显示出这个类其中的长度
        return value.length;
    }

2:关于扩容的方法

private void ensureCapacityInternal(int minimumCapacity) {
        // 如果是第一次调用,那么这个value的长度就为0
        if (minimumCapacity - value.length > 0) {
            //对value字节数组赋值
            value = Arrays.copyOf(value,
                    newCapacity(minimumCapacity));
        } 
    }

//关于除去字符串空值得方法
 public void trimToSize() {
     //判断使用的次数与存储的次数作比较
        if (count < value.length) {
            value = Arrays.copyOf(value, count);
        }
    }

/**
  *Arrays。copyof方法中主要是做了两件事
  第一件事是新建一个字节数组
  然后将原来的数组复制到新建的数组中去
  */
public static char[] copyOf(char[] original, int newLength) {
        char[] copy = new char[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

3:关于AbstartctStringBuilder中的append方法

//首先判断是否为空,如果为null值,那么就直接添加一个null值。如果不为null值
首先创建一个新的数组,然后调用String中getChars()方法添加前面的数组中去,再然后就是赋值给count变量,
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;
    }


/**
这里是相当于append天添加一个char数组,这里面的逻辑其实相当于前面的逻辑
*/
 public AbstractStringBuilder append(char[] str) {
        int len = str.length;
        ensureCapacityInternal(count + len);
        System.arraycopy(str, 0, value, count, len);
        count += len;
        return this;
    }

/**
  添加一个boolean类型的数据时,代码逻辑其实都是一样的,只是相对于来是直接往数组中添加false或者是true这两个变量数据
 public AbstractStringBuilder append(boolean b) {
        if (b) {
            ensureCapacityInternal(count + 4);
            value[count++] = 't';
            value[count++] = 'r';
            value[count++] = 'u';
            value[count++] = 'e';
        } else {
            ensureCapacityInternal(count + 5);
            value[count++] = 'f';
            value[count++] = 'a';
            value[count++] = 'l';
            value[count++] = 's';
            value[count++] = 'e';
        }
        return this;
    }
发布了51 篇原创文章 · 获赞 0 · 访问量 765

猜你喜欢

转载自blog.csdn.net/a_liuren/article/details/103533149