StringBudiler源碼簡單解析
阿新 • • 發佈:2019-03-13
字符串 復制 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; }
- 如果值為空,使用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源碼簡單解析