[十三]基礎數據類型之AbstractStringBuilder

 
String內部是一個private final char value[];
也就意味着每次調用的各類處理方法,返回的字符串都是一個新的,性能上,顯然....
因此,對於可變字符序列的需求是很明確的
 
類的層次結構設計,有的時候是自頂而下
有的時候是總結概括,而後抽象出來一個新的類,這很正常
儘管StringBuffer 要比StringBuilder 和 AbstractStringBuilder要早得多了
可是StringBuffer 如今也繼承了這個類
image_5bcd62fe_1137
因此說,拋開發展歷史的過程不說,直接從類的層級結構設計的角度看的話
你能夠認爲AbstractStringBuilder 就是對於可變字符序列的這一律唸的描述
他提供了可變字符序列的一個基本協議約定,也就是基本的功能方法
做爲一個抽象類, 而且也提供了一部分默認的實現
StringBuffer和StringBuilder都是可變的字符序列,因此他們都實現了AbstractStringBuilder
image_5bcd62fe_2581
 

屬性簡介

內部是一個char[] value再也不是final的了,也就意味着可變
他實現了CharSequence接口意味着他是一個字符序列
實現了Appendable接口,意味着他遵循了追加相關的協議
image_5bcd62fe_7963
內部使用char[] value進行數據存儲 , 這個char[] value 是核心
他是有容量大小的,由於數組必然有長度
若是長度沒有超出此容量,就無需分配新的內部緩衝區數組
若是內部緩衝區溢出,則此容量自動增大
 
使用count 記錄已經使用的字符個數
 
還能夠經過有參數的構造方法進行初始化設置value這個字符數組的大小
固然構造方法不是給你用的,是給子類用的
 
既然本質是一個char[] 字符數組,因此能夠說全部的操做都是對於數組的操做
那麼對於一個字符序列,有哪些方法是剛需呢?
也無外乎添加元素/刪除元素/更新元素/獲取元素 這幾種
添加有多是插入中間或者在最後追加
 
咱們知道,數組是順序存儲
因此對於插入這種操做必然會出現大量的元素移動狀況
 

屬性獲取

既然是內部維護了字節數組
必然這個數組自己屬性,長度 ,使用個數的獲取,以及數組的擴大也有相對應的方法可使用
length() 獲取實際數據的個數
capacity() 數組的大小 因此是容量
image_5bcd62fe_1c6e
public void setLength(int newLength) 設置爲指定長度

若是 newLength 參數小於當前長度
則長度將更改成指定的長度, 截斷,數據不變
 
若是 newLength 參數大於或等於當前長度
則將追加有效的 null 字符 ('\u0000'),使長度知足 newLength 參數
public void ensureCapacity(int minimumCapacity)
確保容量至少等於指定的最小值
若是 minimumCapacity 參數爲非正數,則此方法不執行任何操做並返回
image_5bcd62fe_2467
 
參數大於當前容量纔會執行擴展
image_5bcd62fe_119a
 
新容量的大小應大於:minimumCapacity 參數 而且大於 舊容量的兩倍加 2  
 
public void trimToSize() 嘗試縮減空間
若是實際使用的個數小於容量,那麼進行縮減
image_5bcd62fe_7157
 

添加方法

就像咱們剛纔說的那樣,添加元素,分爲尾部追加元素中間插入元素
添加元素的方法也分爲了兩大陣營
AbstractStringBuilder append(Object obj) AbstractStringBuilder insert(int offset, Object obj) 
AbstractStringBuilder append(boolean b) AbstractStringBuilder insert(int offset, boolean b)
AbstractStringBuilder append(char c)
AbstractStringBuilder insert(int offset, char c)
AbstractStringBuilder append(int i) AbstractStringBuilder insert(int offset, int i)
AbstractStringBuilder append(long l) AbstractStringBuilder insert(int offset, long l)
AbstractStringBuilder append(float f) AbstractStringBuilder insert(int offset, float f)
AbstractStringBuilder append(double d) AbstractStringBuilder insert(int offset, double d)
AbstractStringBuilder append(CharSequence s) AbstractStringBuilder insert(int dstOffset, CharSequence s)
AbstractStringBuilder append(CharSequence s, int start, int end)
AbstractStringBuilder insert(int dstOffset, CharSequence s,int start, int end)
AbstractStringBuilder append(char[] str) AbstractStringBuilder insert(int offset, char[] str)
AbstractStringBuilder append(char str[], int offset, int len)
AbstractStringBuilder insert(int index, char[] str, int offset, int len)
AbstractStringBuilder append(String str) AbstractStringBuilder insert(int offset, String str)
AbstractStringBuilder append(StringBuffer sb)  
AbstractStringBuilder appendCodePoint(int codePoint)  
 
 
從上表能夠看得出來,給各類數據類型都提供了append和insert方法
對於insert 是插入,既然是插入,那麼就須要指定位置
因此與append對應的方法的方法簽名上,都多了一個索引
全部的方法的返回類型都是AbstractStringBuilder
其實都是
return this;
由於他是可變的,因此變化直接體如今了this中,因此返回this就行了
appendCodePoint(int codePoint) 與  append(char c)  能夠說是同樣的
可是對於輔助平面顯然又不同,char不支持輔助平面
 

獲取方法 

獲取代碼點

代碼點相關的五個方法
charAt(int) / codePointAt(int) / codePointBefore(int) / codePointCount(int, int) / offsetByCodePoints(int, int)
他們與String中的是如出一轍的,代碼也是同樣的(就有個變量名變更)
 

複製 

getChars(int, int, char[], int)
將字符今後序列複製到目標字符數組 dst  與String中的方法也幾乎一致

索引下標

int indexOf(String str)
int indexOf(String str, int fromIndex)
第一次出現的指定子字符串在該字符串中的索引
能夠指定索引
指定索引就從索引處開始查找匹配
知足的條件爲startsWith true (而且在範圍內 若是有設置)
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)
返回最右邊出現的指定子字符串在此字符串中的索引 
也就是最後一個
能夠指定索引
指定索引就從索引處 反向匹配
知足的條件也是startsWith true (而且在範圍內 若是有設置)

獲取子串

public 
String substring(int start, int end)
根據索引返回子串
image_5bcd62fe_780d
public String substring(int start) substring(int start, int end)的簡化方法
指定開始位置,默認結束位置爲最後
image_5bcd62fe_5e54
public
CharSequence subSequence(int start, int end)
爲了實現CharSequence方法
內部調用的substring
image_5bcd62fe_37b8
 

更新方法

更新方法比較少,由於是數組
數組的訪問按照下標進行設置就行了
還提供了替換的功能,也算是更新操做
image_5bcd62fe_5494
AbstractStringBuilder replace(int start, int end, String str)
使用str替換對象中從start 開始到end結束的這一段 
 

刪除方法

AbstractStringBuilder delete(int start, int end) 刪除指定範圍的char
image_5bcd62fe_59d5
AbstractStringBuilder deleteCharAt(int index)  刪除某個位置的char
image_5bcd62ff_71c3
 
 

其餘方法

reverse()
按照字符進行翻轉
將此字符序列用其反轉形式取代
就是翻轉每個char,注意可不是翻轉比特位,也不是翻轉字節,反轉的是代碼單元
不過對於輔助平面的字符的代碼點,他們會按照字符進行翻轉,也就是高代理低代理順序不會改變
執行操做前未成對的低代理項和高代理項將成爲代理項對
例如,反轉 "\uDC00\uD800" 將生成有效的代理項對 "\uD800\uDC00"
 

總結

如同咱們上面說的,AbstractStringBuilder就是  可變 字符序列的一個綱領
它規定了可變字符序列應該有的行爲
好比 添加字符/刪除字符/更新字符/獲取字符
由於可變,因此對於可變的支持,天然是必不可少的
另外,他做爲String在不少方面的一個替代,必然也是提供了String的一些功能方法
不然與String API 變化巨大 也是毫無心義
由於畢竟自己就是爲了描述字符序列
因此對於AbstractStringBuilder  只須要完全理解了他做爲 可變字符序列的標準接口便可
相關文章
相關標籤/搜索