Java 8 API学習23-java.lang.Appendable,StringBuilderおよびStringBuffer

4088 ワード

final class StringBuffer extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence;

final class StringBuilder extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

多くの文章で述べたように、StringBufferとStringBuilderの違いは、スレッドが安全であるかどうかであり、両クラスはAbstractStringBuilderに継承され、両者に含まれる方法は同じである.

AbstractStringBuilder


この抽象クラスは非publicであり、パラメータとしてStringBufferとStringBuilderを同時に受け入れることはできないという小さな問題をもたらす.どうしてこんなデザインなのか...
abstract class AbstractStringBuilder implements Appendable, CharSequence

Appendableインタフェース

public interface Appendable

AbstractStringBuilderに加えて、このインタフェースの実装クラスにはjavaがある.nio.CharBuffer, java.io.PrintStreamとjava.io.Writerは、このインタフェースが文字/文字ストリームの接合に用いることがわかる.そのうち1つの方法はappendしかありませんが、3つのリロード方式があります.
Appendable append(char c) throws IOException
Appendable append(CharSequence csq) throws IOException
// csq            
Appendable append(CharSequence csq, int start, int end) throws IOException

注意2つの点:上記の方法ではIOExceptionが投げ出されます.戻り値はAppendableです.

StringBuilderの方法


実は両者の方法は同じである、ここではStringBuilderを例に説明する.

コンストラクタ


各StringBuilderインスタンスにはchar配列格納文字があります.ArrayListと同様に、長さが足りない場合は新しい配列を作成し、古い要素をコピーします.StringBuilderとStringBufferの構造関数の形式も同じである.
StringBuilder() //  capacity=16
StringBuilder(int capacity)
StringBuilder(CharSequence) //    CharSequence
StringBuilder(String) //    String.        ?

StringBuilderの方法(50個)


なお、次のメソッドの戻り値はStringBuilderタイプであればreturnthisを表すので、これらのメソッドを連続的に呼び出すことができる.1.append(13個)
//Appendable     2     ,        
StringBuilder append(CharSequence)
StringBuilder append(CharSequence s, int start, int end) 

StringBuilder append(String)
StringBuilder append(StringBuffer)

/*          ,                   ,
       String.valueOf();
      short byte,               append(int).*/
StringBuilder append(boolean)
StringBuilder append(int)
StringBuilder append(long)
StringBuilder append(float)
StringBuilder append(double)

StringBuilder append(char)
StringBuilder append(char[])
StringBuilder append(char[] str, int offset, int len) //       

StringBuilder append(Object) //  append(obj.toString())
  • insert(12個)は文字列の間に挿入されるので、方法はappendと同様であり、StringBufferへの伝達形式
  • が少ない.
    StringBuilder insert(int, char)
    StringBuilder insert(int, char[])
    StringBuilder insert(int index, char[] str, int offset, int len)
    
    StringBuilder insert(int, CharSequence)
    StringBuilder insert(int, CharSequence s, int start, int end)
    
    StringBuilder insert(int, String)
    
    StringBuilder insert(int, boolean)
    StringBuilder insert(int, int)
    StringBuilder insert(int, long)
    StringBuilder insert(int, float)
    StringBuilder insert(int, double)
    StringBuilder insert(int, Object)
    
  • その他の方法(20個)
  • int length()
    void setLength(int newLength) //    ,    0  
    
    //  length capacity   :        ,              
    int capacity() 
    void ensureCapacity(int)
    void trimToSize()
    
    char charAt(int)
    void setCharAt(int, char)
    
    //         dst[]       
    void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 
    
    StringBuilder delete(int start, int end)
    StringBuilder deleteCharAt(int index)
    
    int indexOf(String str)
    int indexOf(String str, int fromIndex)
    int lastIndexOf(String str)
    int lastIndexOf(String str, int fromIndex)
    
    //  replace  [start, end - 1]    str  ,  String.replace   
    StringBuilder replace(int start, int end, String str)
    
    StringBuilder reverse()
    
    //  CharSequence  
    CharSequence subSequence(int start, int end)
    
    //        
    String substring(int start)
    String substring(int start, int end)
    
    String toString()
    
  • codepoint相関(5個)
  • StringBuilder appendCodePoint(int)
    int codePointAt(int)
    int codePointBefore(int)
    int codePointCount(int beginIndex, int endIndex)
    int offsetByCodePoints(int index, int codePointOffset)
    

    まとめ


    StringBuilderとStringBufferの実質は1つのchar配列に対する操作でしょう...