JAva Stringクラスまとめ


Stringクラスインスタンスオブジェクトの不変性:
Stringの2つの宣言方法:-方法1:よく使用する文字列宣言方法でオブジェクトを宣言します.
  String s1 = "abc";
  String s2 = "abc";
  System.out.println(s1 == s2);//true

-方式2:newオブジェクトによる方式:
  String s1= new String("abc");
  String s2= new String("abc");
  System.out.println(s1 == s2);//false

(1)この2つの宣言方式はメモリ内で異なり、まずStringクラスがfinalクラスである第1の方式は以下に相当する.
    final String s1 = "abc"

文字列定数を定義することに相当し、メモリに定数を格納するための特殊な空間を有し、その定数の値は変更できない(Stringの不変性1).定数を作成するとjvm対はメモリに定数があるかどうかを判断し、ない場合は作成し、ある場合は新しい参照のみが定数を指す.(2)第2の方法で作成され、他のクラスと同様にnewの新しいオブジェクトがスタックメモリに空間を開く方法2 newは2つのオブジェクトを開き、オブジェクトの内容は同じであるがメモリアドレスが異なり、==オペレータが比較するのは2つのオブジェクトのヘッダメモリアドレスであるため、結果はfalseである.
Stringクラス生成オブジェクトは変更できますが、変更すると新しいオブジェクトが返されます.
上記の2つの方法で作成された文字列は、concatメソッドを使用してオブジェクトの内容を変更することができ、文字列が変更されると新しい文字列が返されます.-方式1はまた1つの文字列定数を生成することに相当し、-方式2は1つの文字列オブジェクトを生成することに相当する.だから==で比較すると、2つの方法で新しく生成された文字列は前の文字列と同じではありません.
String対「+」の重荷重
Javaはリロード演算子をサポートしていないことを知っています.Stringの「+」はjavaの中で唯一のリロード演算子ですが、javaはどのようにこのプラス記号を実現しますか?まずコードを見てみましょう.
public static void main(String[]args){String string="hollis";String string 2=string+"chuang"}このコードを逆コンパイルします.
public static void main(String args[]){String string="hollis";String string 2=(new StringBuilder(String.valueOf(string)).append("chuang").toString()}反コンパイル後のコードを見て、実際にStringの"+"に対するサポートはStringBuilderと彼のappend、toStringの2つの方法を使用していることが分かった.ここでは、まずnewにStringBuilderオブジェクトが表示され、スタックメモリにオブジェクトが作成され、String 2はそのオブジェクトのメモリアドレスを指します.だからStringが指すアドレスとは違います.
String文字列のフォーマット出力:
  • メソッド1:system.out.printf文を使用して出力String文字列をフォーマットできます.
    System.out.printf("The value of the float variable is " +
              "%f, while the value of the integer " +
              "variable is %d, and the string " +
              "is %s", float    , int    , string    );
    
  • メソッド2:Stringクラスのformatメソッドを使用して、生成文字列オブジェクトをフォーマットすることもできます.
    String fs;//      fs  
      fs = String.format("The value of the float variable is " +
               "%f, while the value of the integer " +
               "variable is %d, and the string " +
               "is %s", float    , int    , string    );
                System.out.println(fs);//         
    

  • Stringの比較方法:
  • メソッド1「s 1==s 2」は、両者が指すオブジェクトメモリアドレスが同じかどうかを比較する.
  • メソッド2「s 1.equal(s 2)」は、Objectクラスのequal()メソッドを上書きします.
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {//         String    
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {//    string              ;
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {//          ,v[i]       Unicode       ;
                        if (v1[i] != v2[i])
                            return false;
                    i++;
            }
            return true;
        }
    }
    return false;
    }
    
  • メソッド3:compareto()メソッド:
    public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;//String         char[]
        char v2[] = anotherString.value;
    
        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }
    
    return
  • the value 0 if the argument string is equal to this string;
  • a value less than 0 if this string is lexicographically less than the string argument; and a
  • value greater than 0 if this string is lexicographically greater than the string argument.つまり、2つの文字列が同じ場合は0を返し、2つの文字列が異なる場合は最初の異なる文字のunicode符号化値の差を返します.


  • 参考資料:
    JAva Stringオブジェクトの古典的な問題http://sarin.iteye.com/blog/603684