JavaにおけるString型データの保存方法

Javaでは、String型のデータは文字列プールを使って保存されます。文字列プールはJavaヒープメモリ内の特別な領域であり、文字列定数オブジェクトを保存するために使用されます。

私たちが文字列リテラルでStringオブジェクトを作成すると、JVMはまず文字列プールに同じ値の文字列オブジェクトが既に存在するかどうかをチェックします。存在すれば、そのオブジェクトへの参照を返します。存在しない場合、新しい文字列オブジェクトを文字列プールに作成し、そのオブジェクトへの参照を返します。

例えば、以下のコードのstr1とstr2は、同じ文字列オブジェクトを指す文字列プールへの参照です。

String str1 = "hello";
String str2 = "hello";

newキーワードを使用してStringオブジェクトを作成すると、JVMは新しい文字列オブジェクトをヒープメモリに割り当てます。文字列プールに同じ値の文字列オブジェクトが存在していても関係ありません。したがって、次のコードのstr3とstr4は異なる文字列オブジェクトを指しています。

String str3 = new String("hello");
String str4 = new String("hello");

注意すべきは、文字列プール内の文字列オブジェクトは不変であるということです。つまり、一度文字列オブジェクトが作成されると、その値を変更することはできません。文字列オブジェクトを変更すると、実際には新しい文字列オブジェクトが作成されることになります。

Javaは文字列の比較効率を向上させるために、文字列定数プールのintern()メソッドを提供しています。このメソッドを呼び出すと、文字列オブジェクトが文字列定数プールに追加されます。すでに同じ値の文字列オブジェクトが文字列定数プールに存在する場合は、そのオブジェクトの参照が返されます。存在しない場合は、オブジェクトが文字列定数プールに追加され、その参照が返されます。例えば、

String str5 = new String("hello").intern();
String str6 = "hello";
System.out.println(str5 == str6);  // 输出true

intern()メソッドを呼び出すことにより、str5の値が文字列プールに追加されたため、str5とstr6は同じ文字列オブジェクトを指しています。

bannerAds