Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaにおける文字列のインターン(intern)とは?仕組みと動作をわかりやすく解説

文字列インターンとは

文字列インターン(String Interning)とは、重複のないすべての文字列値について、その単一のコピーだけを保持する仕組みです。JavaのStringオブジェクトは不変(イミュータブル)であるため、同じ内容を持つ文字列同士は同一のメモリ領域を共有できます。この仕組みを活用することで、文字列処理に必要なメモリ使用量を大幅に削減することが可能になります。

intern()メソッドの動作

intern()メソッドが呼び出されると、内部的には以下のような処理が行われます。

  • 対象の文字列オブジェクトが、文字列定数プール(String Constant Pool:SCP)に存在するかどうかを確認します。
  • プール内に既に存在する場合は、そこから文字列を取得して返します。存在しない場合は、新しいStringオブジェクトを作成してプールに追加し、その参照を返します。
  • 2つの文字列aとbに対して、a.intern() == b.intern()がtrueとなるのは、a.equals(b)がtrueを返す場合かつその場合に限られます。

サンプルコード

public class Demo{
    public static void main(String[] args){
        String s1 = new String("Its");
        String s2 = s1.concat("sample");
        String s3 = s2.intern();
        System.out.println("Checking equality of object 2 and 3 :");
        System.out.println(s2 == s3);
        String s4 = "Its a sample";
        System.out.println("Checking equality of object 3 and 4 :");
        System.out.println(s3 == s4);
    }
}

実行結果

Checking equality of object 2 and 3 :
true
Checking equality of object 3 and 4 :
false

コードの解説

Demoクラスのmainメソッド内では、複数のStringオブジェクトが定義されています。まずs1として「Its」という文字列を生成し、次にs2としてs1に別の値「sample」を連結した文字列を作成します。さらにs3は、s2に対してintern()メソッドを呼び出した結果として得られる参照です。最後にs4として、文字列リテラル「Its a sample」を定義しています。

これらの文字列は「==」演算子によって比較され、その結果がコンソールに出力されます。「==」演算子は文字列の内容ではなく、オブジェクトの参照(メモリ上の位置)が同一かどうかを判定する点に注意してください。

s2とs3の比較がtrueになるのは、intern()呼び出し時にプールへ登録された参照とs2が一致するためです。一方、s4は内容が異なる別の文字列リテラルとしてプールに登録されるため、s3との比較結果はfalseとなります。このように、intern()を使うことで文字列定数プールとの関係を明示的に制御でき、メモリ効率の向上や比較処理の高速化が期待できます。

  1. JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説

    StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T

  2. Javaのポリモーフィズム(多態性)とは?基本概念と具体例をわかりやすく解説

    ポリモーフィズム(多態性)とは ポリモーフィズム(多態性)とは、ひとつのオブジェクトが複数の形態(型)を持つことができる性質のことです。オブジェクト指向プログラミング(OOP)において最も一般的な活用場面は、親クラスの参照変数を使って子クラスのオブジェクトを参照するケースです。 すべてのJavaオブジェクトはポリモーフィック 複数のIS-Aテストに合格できるJavaオブジェクトは、ポリモーフィックであるとみなされます。Javaでは、あらゆるオブジェクトが「自分自身の型」に対するIS-Aテストと「Objectクラス」に対するIS-Aテストの両方に合格するため、すべてのJavaオブジェクトは本質