Stringのまとめ
1 Javaにおける定数プールの区分(1)グローバル文字列プール(string pool)—グローバル文字列プールの内容はクラスロードが完了し、検証、準備フェーズが完了した後、スタック内で文字列オブジェクトインスタンスを生成し、その文字列オブジェクトインスタンスの参照値をstring poolに保存します.-文字列定数プールには、特定のインスタンスオブジェクトではなく参照値が格納されます.特定のインスタンスオブジェクトは、スタックに開いた空間に格納されます.-HotSpot VMでstring pool機能を実現しているのはStringTableクラスであり、ハッシュテーブルであり、そこには常駐文字列(すなわち、二重引用符で囲まれた文字列)の参照が格納されている.つまり、スタック内のいくつかの文字列インスタンスがこのStringTableで参照された後、「常駐文字列」のアイデンティティが付与されている.このStringTableは、HotSpot VMのインスタンスごとに1つしかなく、すべてのクラスで共有されています.-利点:同じコンテンツの文字列の作成を回避し、メモリを節約し、同じ文字列を作成する時間を節約し、パフォーマンスを向上させることができます.(2)classファイル定数プール-コンパイル中に生成された様々な字面量とシンボル参照を格納するために使用されます.-字面量:テキスト文字列、finalとして宣言された定数値など、java言語レベルに近い定数概念.-シンボルリファレンス:リファレンスされたターゲットをシンボルのセットで記述します.シンボルは、使用時にターゲットに曖昧に位置決めできる限り、任意の形式の字面量で使用できます.一般に、次の3つの定数が含まれます.・クラスとインタフェースの全制限定名・フィールドの名前と記述子・メソッドの名前と記述子-定数プールの各定数は1つのテーブルで、合計14種類あります.(3)実行時定数プール-実行時定数プールはメソッド領域の一部であり、クラスがメモリにロードされると、JVMはclass定数プールの内容を実行時定数プールに格納します.-ランタイムプールは各クラスにプライベートです.—一般にclass定数プールには,オブジェクトのシンボル参照だけでなく,解析後の直接参照も実行時定数プールに格納される.解析の過程で、グローバル文字列プールがクエリーされ、実行時定数プールで参照される文字列がグローバル文字列プールで参照される文字列と一致することを保証します.
2 Stringクラスの特徴-Stringクラスは初期化後は可変ではありません.-Stringクラスはfinalクラスです.つまり、Stringクラスは継承できず、メンバーメソッドはfinalメソッドとしてデフォルト設定されています.-Stringクラスがfinalで修飾されている理由:・セキュリティ:Stringクラスが可変でないため、修正されないため、マルチスレッド競合のスレッドセキュリティの問題が回避される.・効率:Stringクラスはプログラムの中で出現する頻度が比較的に高く、安全上の危険性を避けるために、それが出現するたびにfinalで修飾する必要があり、もし使用がよくなければ、明らかな性能問題が発生するので、いっそfinalクラスを作り、定数プールに置いてデータ共有を実現し、資源を節約し、効率を高め、JVMの中で多くの最適化を行うことができる.Stringクラスは文字配列によって文字列を保存します.—Stringオブジェクトが作成されると固定され、Stringオブジェクトに対する変更は元のオブジェクトに影響を与えず、関連する変更操作によって新しいオブジェクトが生成されます.
3文字列の作成-Stringオブジェクトを作成する方法で最も一般的なのは、Stringオブジェクトのコンストラクタを使用して明示的に作成する方法です.たとえば、String str=new String(「Hello」)です.この文を実行すると、現在のstring poolに「Hello」という文字列オブジェクトの参照が存在しない場合、Javaスタックに2つのインスタンスが生成されます.1つは「Hello」のインスタンスオブジェクトであり、文字列定数プールにインスタンスオブジェクトへの参照が保存されています.もう1つはnewから出てきた値が「Hello」のインスタンスオブジェクトです.現在のstring poolにこのStringオブジェクトに等しい文字列の参照がすでに存在する場合、Javaスタックで新しいnewからのインスタンスオブジェクトのみが生成されます.また,いずれの場合も,参照変数strはその新しいnewから出てきたインスタンスオブジェクトを指す.String str="Hello"など、二重引用符で直接作成します.この文は、定数プールに「Hello」オブジェクトの参照がすでに存在するかどうかを検索し、すでに存在する場合は、その参照をコピーして返します.そうでなければ、Javaスタックに新しいオブジェクトが作成され、string poolに参照が挿入され、参照が返されます.-定数のみを含む文字列コネクタを使用しても定数が作成され、コンパイラが最適化します.String str=「ab」+「cd」のように、この文コンパイラは、string poolに最終的に1つの文字列定数「abcd」だけが格納されるように最適化します.-変数を含む文字列コネクタを使用して作成されたオブジェクトの場合、string poolに生成された新しいオブジェクトは格納されません.
4 Stringのintern()メソッド-Nativeメソッドです.文字列定数プールにこのStringオブジェクトに等しい文字列の参照がすでに含まれている場合は、プール内のこの参照をコピーして返します.そうでなければ、Stringオブジェクトの文字列参照を定数プールに追加し、Stringオブジェクトの参照を返します.-JDK 1.6では、intern()メソッドは、最初に遭遇した文字列インスタンスを永続世代にコピーし、永続世代という文字列インスタンスの参照を返します.—JDK 1.7以降、intern()メソッドはインスタンスをコピーしません.ただし、定数プールに最初に表示されたインスタンス参照を記録します.
5 Stringの"=="と"equals"-Stringタイプの変数に対して、==「比較するのは、同じオブジェクトを指すオブジェクトのアドレス、つまり同じオブジェクトを指すかどうかです.-Objectクラスでは、equalsメソッドは、2つのオブジェクトの参照が等しいかどうか、つまり同じオブジェクトを指しているかどうかを比較するために使用されます.Stringクラスは、より指向している文字列オブジェクトよりも格納されているコンテンツが等しいかどうかを書き換えるために使用されます.
6 String、StringBuilder、StringBufferの違い-可変と可変:Stringは可変文字列オブジェクトです.StringBuilderとStringBufferは可変文字列オブジェクトで、内部の文字配列の長さは可変です.-スレッドが安全かどうか:Stringのオブジェクトは可変ではないので、スレッドが安全である必要があります.StringBufferとStringBuilderの方法と機能は基本的に等価であるが、StringBufferの方法の多くはsynchronizedキーワードを用いて同期しているため、StringBufferはスレッドが安全であり、StringBuilderは非スレッドが安全である.—実行効率:一般的に、3つの実行効率の関係は、StringBuilder>StringBuffer>Stringである.—適用例:・String:少量の文字列に適用操作の場合.・StringBuilder:単一スレッドで文字バッファで大量に操作する場合に適用されます.・StringBuffer:マルチスレッドで文字バッファで大量に操作する場合に適用されます.
7 StringのcompareTo()≪メソッド|Method|emdw≫:2つの文字列をディクショナリの順序で比較します.比較は、文字列内の各文字のUnicode値に基づいています.-このStringオブジェクトが表す文字列をディクショナリの順序でパラメータ文字列が表す文字列と比較します.このStringオブジェクトがディクショナリの順序でパラメータ文字列の前にある場合、比較結果は負の整数になります.このStringオブジェクトのビットとパラメータ文字列を辞書順に並べた場合、比較結果は正の整数になります.2つの文字列が等しい場合は0になります.—比較ルール:・まず2つの文字列の長さを比較し、比較が小さい長さで、両者が等しいかどうかを比較します.・等しくない場合は、その位置文字のASCIIコードが減算された値を直接返します.・皆さん同じ値を設定すると、2つの文字列の長さの差が返されます.
2 Stringクラスの特徴-Stringクラスは初期化後は可変ではありません.-Stringクラスはfinalクラスです.つまり、Stringクラスは継承できず、メンバーメソッドはfinalメソッドとしてデフォルト設定されています.-Stringクラスがfinalで修飾されている理由:・セキュリティ:Stringクラスが可変でないため、修正されないため、マルチスレッド競合のスレッドセキュリティの問題が回避される.・効率:Stringクラスはプログラムの中で出現する頻度が比較的に高く、安全上の危険性を避けるために、それが出現するたびにfinalで修飾する必要があり、もし使用がよくなければ、明らかな性能問題が発生するので、いっそfinalクラスを作り、定数プールに置いてデータ共有を実現し、資源を節約し、効率を高め、JVMの中で多くの最適化を行うことができる.Stringクラスは文字配列によって文字列を保存します.—Stringオブジェクトが作成されると固定され、Stringオブジェクトに対する変更は元のオブジェクトに影響を与えず、関連する変更操作によって新しいオブジェクトが生成されます.
3文字列の作成-Stringオブジェクトを作成する方法で最も一般的なのは、Stringオブジェクトのコンストラクタを使用して明示的に作成する方法です.たとえば、String str=new String(「Hello」)です.この文を実行すると、現在のstring poolに「Hello」という文字列オブジェクトの参照が存在しない場合、Javaスタックに2つのインスタンスが生成されます.1つは「Hello」のインスタンスオブジェクトであり、文字列定数プールにインスタンスオブジェクトへの参照が保存されています.もう1つはnewから出てきた値が「Hello」のインスタンスオブジェクトです.現在のstring poolにこのStringオブジェクトに等しい文字列の参照がすでに存在する場合、Javaスタックで新しいnewからのインスタンスオブジェクトのみが生成されます.また,いずれの場合も,参照変数strはその新しいnewから出てきたインスタンスオブジェクトを指す.String str="Hello"など、二重引用符で直接作成します.この文は、定数プールに「Hello」オブジェクトの参照がすでに存在するかどうかを検索し、すでに存在する場合は、その参照をコピーして返します.そうでなければ、Javaスタックに新しいオブジェクトが作成され、string poolに参照が挿入され、参照が返されます.-定数のみを含む文字列コネクタを使用しても定数が作成され、コンパイラが最適化します.String str=「ab」+「cd」のように、この文コンパイラは、string poolに最終的に1つの文字列定数「abcd」だけが格納されるように最適化します.-変数を含む文字列コネクタを使用して作成されたオブジェクトの場合、string poolに生成された新しいオブジェクトは格納されません.
4 Stringのintern()メソッド-Nativeメソッドです.文字列定数プールにこのStringオブジェクトに等しい文字列の参照がすでに含まれている場合は、プール内のこの参照をコピーして返します.そうでなければ、Stringオブジェクトの文字列参照を定数プールに追加し、Stringオブジェクトの参照を返します.-JDK 1.6では、intern()メソッドは、最初に遭遇した文字列インスタンスを永続世代にコピーし、永続世代という文字列インスタンスの参照を返します.—JDK 1.7以降、intern()メソッドはインスタンスをコピーしません.ただし、定数プールに最初に表示されたインスタンス参照を記録します.
5 Stringの"=="と"equals"-Stringタイプの変数に対して、==「比較するのは、同じオブジェクトを指すオブジェクトのアドレス、つまり同じオブジェクトを指すかどうかです.-Objectクラスでは、equalsメソッドは、2つのオブジェクトの参照が等しいかどうか、つまり同じオブジェクトを指しているかどうかを比較するために使用されます.Stringクラスは、より指向している文字列オブジェクトよりも格納されているコンテンツが等しいかどうかを書き換えるために使用されます.
6 String、StringBuilder、StringBufferの違い-可変と可変:Stringは可変文字列オブジェクトです.StringBuilderとStringBufferは可変文字列オブジェクトで、内部の文字配列の長さは可変です.-スレッドが安全かどうか:Stringのオブジェクトは可変ではないので、スレッドが安全である必要があります.StringBufferとStringBuilderの方法と機能は基本的に等価であるが、StringBufferの方法の多くはsynchronizedキーワードを用いて同期しているため、StringBufferはスレッドが安全であり、StringBuilderは非スレッドが安全である.—実行効率:一般的に、3つの実行効率の関係は、StringBuilder>StringBuffer>Stringである.—適用例:・String:少量の文字列に適用操作の場合.・StringBuilder:単一スレッドで文字バッファで大量に操作する場合に適用されます.・StringBuffer:マルチスレッドで文字バッファで大量に操作する場合に適用されます.
7 StringのcompareTo()≪メソッド|Method|emdw≫:2つの文字列をディクショナリの順序で比較します.比較は、文字列内の各文字のUnicode値に基づいています.-このStringオブジェクトが表す文字列をディクショナリの順序でパラメータ文字列が表す文字列と比較します.このStringオブジェクトがディクショナリの順序でパラメータ文字列の前にある場合、比較結果は負の整数になります.このStringオブジェクトのビットとパラメータ文字列を辞書順に並べた場合、比較結果は正の整数になります.2つの文字列が等しい場合は0になります.—比較ルール:・まず2つの文字列の長さを比較し、比較が小さい長さで、両者が等しいかどうかを比較します.・等しくない場合は、その位置文字のASCIIコードが減算された値を直接返します.・皆さん同じ値を設定すると、2つの文字列の長さの差が返されます.
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
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;
}