1. 程式人生 > >StringBudiler源碼簡單解析

StringBudiler源碼簡單解析

字符串 復制 main 是不是 調用 當前 arrays println 第一個

StringBudiler源碼

  • 繼承關系樹
  • 底層實現
  • 默認容量()
  • 特別的添加方法(append)

1、繼承關系樹

繼承自AbstractStringBuilder與StringBuffer同族

2、底層實現

//基本大部分方法都是調用父類的方法,點進父類查看
public StringBuilder() {
    super(16);
}

AbstractStringBuilder.java

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

底層和String一樣使用字符串實現,都是包裝類型

有參構造函數長度擴充為len+16;StringBuilder(CharSequence seq) {}同理

public StringBuilder(String str) {
    super(str.length() + 16);
    append(str);
}

3、默認容量

public StringBuilder() {
    super(16);
}

默認容量16

使用有參構造器返回的容量為str.length()+16

public StringBuilder(String str) {
    super(str.length() + 16);
    append(str);
}

4、添加方法

  @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
//調用父類方法

查看父類的方法

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;
}
  1. 如果值為空,使用appendNull()是不是有個疑問,如果需要添加的值為空時不是直接返回當前StringBuilder就行了嗎,為什麽還要調用一個方法呢?

appendNull()方法

private AbstractStringBuilder appendNull() {
    int c = count;
    ensureCapacityInternal(c + 4);
    final char[] value = this.value;
    value[c++] = 'n';
    value[c++] = 'u';
    value[c++] = 'l';
    value[c++] = 'l';
    count = c;
    return this;
}
  • 判斷容量是否足夠,如果不夠通過Arrays.copy復制到新的字符串數組中然後將‘null‘添加到StringBuilder中

回到append(String str)方法

//擴容
ensureCapacityInternal(count + len);
//value為StringBuilder中實際擁有的char[],這裏是講str復制到value也就是StringBuilder裏面去
str.getChars(0, len, value, count);
//變更實際長度
count += len;

return this;

append(StringBuffer sb)方法

public AbstractStringBuilder append(StringBuffer sb) {
    
}

來看一下使用append(String str)方法添加一個空字符串

public static void main(String[] args) {
    
            StringBuilder sb = new StringBuilder();
            System.out.println("字符串第一個值:"+sb+"  ; 長度:"+sb.length());
            String str = null;
            sb.append(str);
            System.out.println("修改後:"+sb+"  ; 長度:"+sb.length());
    }
    

測試結果:

字符串第一個值: ; 長度:0
修改後:null ; 長度

至於為什麽是添加‘null‘,這裏就存疑,有知道的小夥伴可以在評論中回復

StringBudiler源碼簡單解析