AbstractStringBuilder StringBuffer StringBuilder

接口 Appendable

public interface Appendable {
    Appendable append(char c) throws IOException; //1
    Appendable append(CharSequence csq, int start, int end) throws IOException;//2
}

接口  CharSequence

java8新增2個default方法

String AbstractStringBuilder  StringBuffer  StringBuilder 均實現了CharSequence

疑點:AbstractStringBuilder 是StringBuffer  StringBuilder的父類,已經父類已經實現了接口CharSequence

StringBuffer  StringBuilder 本應不必要在實現接口 ,有聲明實現接口CharSequence的必要性是?

(個人見解) 爲了顯示的說明 StringBuffer  StringBuilder也實現接口CharSequence

default 修飾接口內的方法後 該方法可以具體實現

public interface CharSequence {
    int length();
    char charAt(int index);
    CharSequence subSequence(int start, int end);
    public String toString()
    public default IntStream chars() //省略其實現
    public default IntStream codePoints()//省略其實現
//分別轉換爲以char和codepoint爲單位的java stream.注意轉換後爲int類型的unicode編碼.
}

 

 抽象類 AbstractStringBuilder

StringBuffer 和 StringBuilder 繼承的抽象類 AbstractStringBuilder

AbstractStringBuilder類完成了 維護可變數組的實現 其中所有方法均爲實例方法

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char[] value;
    int count; //數組內實際的存儲的長度
 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    //構造函數見下表格
...

 與實現可變數組功能相關的方法

    public void ensureCapacity(int minimumCapacity) {
        if (minimumCapacity > 0)
            ensureCapacityInternal(minimumCapacity);
    }

//實現數組空間處理的 三個私有方法
    private void ensureCapacityInternal(int minimumCapacity) { //實際執行擴容的方法
        // overflow-conscious code  疑問: 爲何不與count比較? 爲減少更新容量的範圍 所以與更大一些的  value.length 相比
        if (minimumCapacity - value.length > 0) { //參數 大於 當前字符串容量 則擴展到參數大小的字符數組
            value = Arrays.copyOf(value,  newCapacity(minimumCapacity));
        }
    }
        //兩個判斷擴展後的容量的最小值該爲多少
 private int newCapacity(int minCapacity) {  //
        // overflow-conscious code
        int newCapacity = (value.length << 1) + 2; //爲什麼 +2
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }
    private int hugeCapacity(int minCapacity) { //實際允許的最大容量是Integer.MAX_VALUE
        if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
            throw new OutOfMemoryError();
        }
        return (minCapacity > MAX_ARRAY_SIZE)    // MAX_ARRAY_SIZE爲類中常量 其值爲Integer.Max_VALUE - 8  (VM可能需要在數組頭部存儲信息 所以 減去8)
            ? minCapacity : MAX_ARRAY_SIZE;
    }
public int capacity() {  //查看字符數組的容量
    return value.length;
}
public int length() {    //查看字符數組的已使用的長度
    return count;
}
append    
public AbstractStringBuilder  return 語句  
append(Object obj)  append(String.valueOf(obj));  
append(String s)        if (s == null)      return appendNull();//私有方法用於處理 添加"null"
        int len = s.length();
        ensureCapacityInternal(count + len);
        sb.getChars(0, len, value, count);//在當
        count += len;
        return this;
 
append(StringBuffer s)  
(缺省) append(AbstractStringBuilder s )  
append(CharSequence s) 覆蓋Appendable接口的append方法1 用instanceof 判斷類型在調用其他append方法  
append(CharSequence s, int start, int end) 覆蓋Appendable接口的append方法2  
append(char[] str)    
append(char str[], int offset, int len)     

append(xxx)

//xxx: (除short和byte的基本類型)

   
appendCodePoint(int codePoint)    

public AbstractStringBuilder 

刪   

delete(int start, int end)  
deleteCharAt(int index) System.arraycopy(value, index+1, value, index, count-index-1); count--;

改  

public void

setLength(int newLength)

作用: 將目前已經用了的長度(即count)更改爲 參數大小

參數要求:  必須大於等於0

若newLength大於當前實際容量,則容量將擴展到參數大小 

字符數組的 [原count , newLength)範圍內填充'\0' (空字符)

public void setCharAt

(int index, char ch)

作用:將字符數組中指定下標的元素替換 

注意: 僅允許替換  [0, count) 部分的下標

(public) insert   

insert(xxx)//xxx: (除short和byte的基本類型)

insert

(int offset, char[] str)

例如 在abcde 在下標2處插入某字符數組str ->ab[str]cde

確保內部容量 ensureCapacityInternal(count + str.length)

利用System.arraycopy()方法進行兩次複製

第一次複製:插入位置之後的子串 cde

第二次複製:用str填充 第一次複製時原字符串之間的空白

insert(int index, char[] str, int offset,  int len)

insert(int offset, String str)
insert(int offset, Object obj)
insert(int dstOffset, CharSequence s)
insert(int dstOffset, CharSequence s,    int start, int end)
public AbstractStringBuilder replace(int start, int end, String str) 

長度 / 容量 Length() /Capacity()
以下標 字符 char charAt(int index)  注意: 僅允許替換  [0, count) 部分的下標
(public)indexOf    
int indexOf String str )  
int indexOf (String str, int fromIndex)
int lastIndexOf(String str)  

int lastIndexOf(String str, int fromIndex){
        return String.indexOf(value, 0, count, str, fromIndex);   }

對應下標元素的代碼點  
返回指定下標處的代碼點 int codePointAt(int index)
  int codePointBefore(int index)
  int codePointCount(int beginIndex, int endIndex)
  int offsetByCodePoints(int index, int codePointOffset) 
   
   void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
轉換  
public void trimToSize()  去掉字符數組中未用到的空間
取子串  
 public String substring(int start)

public String substring (int start, int end)

 

public CharSequence subSequence(int start, int end)
反轉  public AbstractStringBuilder reverse()
    public void trimToSize() {      //去掉字符數組中多餘空間
        if (count < value.length) {
            value = Arrays.copyOf(value, count);
        }
    }
 
   public AbstractStringBuilder reverse() {
        boolean hasSurrogates = false;
        int n = count - 1;                   //下標範圍 0 - count-1
        for (int j = (n-1) >> 1; j >= 0; j--) {
            int k = n - j;
            char cj = value[j];
            char ck = value[k];
            value[j] = ck;
            value[k] = cj;
            //if語句判斷 已交換的字符是否爲補增字符集  若爲補增字符集 翻轉前:高代理 低代理->低代理 高代理 (順序已錯誤錯誤)
            if (Character.isSurrogate(cj) ||
                Character.isSurrogate(ck)) {
                hasSurrogates = true;
            }
        }
        if (hasSurrogates) {            //(將已調換造成錯誤順序的)補增字符 調換正確
            reverseAllValidSurrogatePairs();// 低代理 高代理->高代理 低代理
        }
        return this;
    }

 

AbstractStringBuilder StringBuffer StringBuilder
構造函數  
AbstractStringBuilder() {  }  public StringBuffer() { super(16);}     public StringBuilder() { super(16); }
     
AbstractStringBuilder(int capacity) {
        value = new char[capacity]; }
public StringBuffer(int capacity) {
        super(capacity);. }
    public StringBuilder(int capacity) {
        super(capacity); }
  public XX(String str) {   super(str.length() + 16);     append(str);  }   
  public XX(CharSequence seq) {   this(seq.length() + 16);   append(seq);    }

 

StringBuilder這個類的設計用途是作爲一個臨時替代 用於單個線程  主要應用 append 和 insert方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章