[十三]基礎數據類型之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  只需要徹底理解了他作為 可變字符序列的標准接口即可
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM