Java での文字列インターン

Rupam Yadav 2023年10月12日
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 クラス str1str2 の 2つのオブジェクトがありますが、どちらにも同じコンテンツが含まれています。== 演算子を使用してそれらを比較し、それらが等しいかどうかを確認すると、出力には false が表示され、等しくなりません。

これは、ヒープ内のさまざまな場所に配置されているために発生します。2つのオブジェクトであることに加えて、両方のオブジェクトに大きな違いはありません。

文字列インターニングの概念を使用する場合、単一のオブジェクトのみを作成し、それを strObj と想定します。これで、オブジェクトのコンテンツが含まれます。オブジェクトにアクセスしたい場合は、このオブジェクトを参照してコンテンツを取得できます。

Java での文字列インターニングの使用

以下の例では、intern() を使用して文字列インターニングのメソッドを使用する方法を示しています。5つの文字列変数を作成します。

最初の文字列変数 strnew String() を使用して作成され、文字列はコンストラクターに渡されます。次に、new キーワードを使用して別の文字列オブジェクトを作成しますが、String() コンストラクターから intern() メソッドを呼び出します。

最後の 3つの変数は文字列リテラルであり、最後の変数 str5 には他のすべての文字列変数とは異なる内容が含まれています。文字列リテラルはすでに SCP に配置されているため、最後の 3つの変数で intern() メソッドを使用していないことに注意してください。これは、インターンが自動的に適用されることを意味します。

次に、変数を比較して、それらが一致するかどうかを確認します。オブジェクトが正確なメモリ位置を参照している場合に true を返す == 演算子を使用します。最初の文字列 str1intern() メソッドを呼び出さないため、別のメモリ位置にあり、str1 == str2 は実行されません。

str2 は、intern() を呼び出すために SCP に含まれ、文字列リテラルである str3 と比較すると、true を返し、出力を実行します。次に、コンソールにメッセージを出力する、同じ内容の 2つの文字列リテラル str3str4 を比較します。

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 Yadav
Rupam Yadav avatar Rupam Yadav avatar

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

関連記事 - Java String