Java での文字列インターン
今日は、文字列のインターニング、つまり String クラスの intern()
メソッドについて説明します。以下のポイントでは、例を使用して、文字列インターニングとは何か、および文字列インターニングを使用する必要がある理由を学習します。
Java での文字列インターンとは何ですか?いつ使用するか
Java はオブジェクト指向プログラミング言語です。オブジェクトや変数を作成するときは、ある程度のメモリが必要です。つまり、String
クラスのインスタンスを 100 個作成すると、それらはヒープなどのメモリ内のさまざまな場所に格納され、多くのスペースを消費する可能性があります。
この問題に取り組むために、Java 開発者は、同じメモリプールを共有するオブジェクトを含む文字列定数プール(SCP)のアイデアを導入しました。
SCP には、同じコンテンツを持つすべての String オブジェクトが含まれているため、複数のオブジェクトを見つける必要がないため、オブジェクトをフェッチするのが簡単でメモリを節約できます。参照できるオブジェクトは 1つだけです。
それをよりよく理解するために、簡単な例を見てみましょう。
String str1 = new String("String A");
String str2 = new String("String A");
System.out.println(str1 == str2);
出力:
false
上記のコードには、String
クラス str1
と str2
の 2つのオブジェクトがありますが、どちらにも同じコンテンツが含まれています。==
演算子を使用してそれらを比較し、それらが等しいかどうかを確認すると、出力には false
が表示され、等しくなりません。
これは、ヒープ内のさまざまな場所に配置されているために発生します。2つのオブジェクトであることに加えて、両方のオブジェクトに大きな違いはありません。
文字列インターニングの概念を使用する場合、単一のオブジェクトのみを作成し、それを strObj
と想定します。これで、オブジェクトのコンテンツが含まれます。オブジェクトにアクセスしたい場合は、このオブジェクトを参照してコンテンツを取得できます。
Java での文字列インターニングの使用
以下の例では、intern()
を使用して文字列インターニングのメソッドを使用する方法を示しています。5つの文字列変数を作成します。
最初の文字列変数 str
は new String()
を使用して作成され、文字列はコンストラクターに渡されます。次に、new
キーワードを使用して別の文字列オブジェクトを作成しますが、String()
コンストラクターから intern()
メソッドを呼び出します。
最後の 3つの変数は文字列リテラルであり、最後の変数 str5
には他のすべての文字列変数とは異なる内容が含まれています。文字列リテラルはすでに SCP に配置されているため、最後の 3つの変数で intern()
メソッドを使用していないことに注意してください。これは、インターンが自動的に適用されることを意味します。
次に、変数を比較して、それらが一致するかどうかを確認します。オブジェクトが正確なメモリ位置を参照している場合に true
を返す ==
演算子を使用します。最初の文字列 str1
で intern()
メソッドを呼び出さないため、別のメモリ位置にあり、str1 == str2
は実行されません。
str2
は、intern()
を呼び出すために SCP に含まれ、文字列リテラルである str3
と比較すると、true
を返し、出力を実行します。次に、コンソールにメッセージを出力する、同じ内容の 2つの文字列リテラル str3
と str4
を比較します。
public class JavaExample {
public static void main(String[] args) {
String str1 = new String("String A");
String str2 = new String("String A").intern();
String str3 = "String A";
String str4 = "String A";
String str5 = "String B";
if (str1 == str2) {
System.out.println("str1 and str2 are in the same SCP");
}
if (str1 == str3) {
System.out.println("str1 and str3 are in the same SCP");
}
if (str2 == str3) {
System.out.println("str2 and str3 are in the same SCP");
}
if (str3 == str4) {
System.out.println("str3 and str4 are in the same SCP");
}
if (str4 == str5) {
System.out.println("str3 and str4 are in the same SCP");
}
}
}
出力:
str2 and str3 are in the same SCP
str3 and str4 are in the same SCP
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn