logo

Java String intern()

Java 文字列クラス インターン() メソッドはインターンされた文字列を返します。文字列の正規表現を返します。

新しいキーワードによって作成された文字列をメモリから返すために使用できます。ヒープ文字列オブジェクトの正確なコピーを文字列定数プールに作成します。

サイン

intern() メソッドのシグネチャを以下に示します。

Javaの面接の質問
 public String intern() 

戻り値

インターンされた文字列

String.intern() メソッドの必要性と仕組み

Java で文字列が作成されると、ヒープ内のメモリを占有します。また、String クラスが不変であることもわかっています。したがって、 new キーワードを使用して文字列を作成するたびに、配列の内容に関係なく、対応する文字列のヒープに新しいメモリが割り当てられます。次のコード スニペットを考えてみましょう。

 String str = new String('Welcome to JavaTpoint.'); String str1 = new String('Welcome to JavaTpoint'); System.out.println(str1 == str); // prints false 

文字列リテラルごとに個別のメモリが割り当てられるため、println ステートメントは false を出力します。したがって、2 つの新しい文字列オブジェクト (str と str1) がメモリ内に作成されます。さまざまな参照を保持します。

Java ではオブジェクトの作成はコストのかかる操作であることがわかっています。したがって、時間を節約するために、Java 開発者は String Constant Pool (SCP) の概念を考案しました。 SCP はヒープ メモリ内の領域です。固有の文字列が含まれています。文字列を文字列プールに入れるには、 インターン() 方法。文字列プールにオブジェクトを作成する前に、JVM は文字列がプールにすでに存在するかどうかを確認します。文字列が存在する場合は、その参照が返されます。

Excelの日付の違い
 String str = new String('Welcome to JavaTpoint').intern(); // statement - 1 String str1 = new String('Welcome to JavaTpoint').intern(); // statement - 2 System.out.println(str1 == str); // prints true 

上記のコード スニペットでは、String オブジェクトに対して intern() メソッドが呼び出されます。したがって、メモリは SCP に割り当てられます。 2 番目のステートメントでは、str と str1 の内容が同じであるため、新しい文字列オブジェクトは作成されません。したがって、str1 には最初のステートメントで作成されたオブジェクトの参照が返されます。したがって、str と str1 は両方とも同じメモリを指します。したがって、print ステートメントは true を出力します。

Java String intern() メソッドの例

ファイル名: InternExample.java

 public class InternExample{ public static void main(String args[]){ String s1=new String('hello'); String s2='hello'; String s3=s1.intern();//returns string from pool, now it will be same as s2 System.out.println(s1==s2);//false because reference variables are pointing to different instance System.out.println(s2==s3);//true because reference variables are pointing to same instance }} 
今すぐテストしてください

出力:

 false true 

Java String intern() メソッドの例 2

文字列インターンの概念を理解するために、もう 1 つの例を見てみましょう。

ファイル名: InternExample2.java

 public class InternExample2 { public static void main(String[] args) { String s1 = 'Javatpoint'; String s2 = s1.intern(); String s3 = new String('Javatpoint'); String s4 = s3.intern(); System.out.println(s1==s2); // True System.out.println(s1==s3); // False System.out.println(s1==s4); // True System.out.println(s2==s3); // False System.out.println(s2==s4); // True System.out.println(s3==s4); // False } } 
今すぐテストしてください

出力:

タイプスクリプトごとに
 true false true false true false 

留意事項

intern() メソッドに関して覚えておくべき重要な点を次に示します。

1) 文字列リテラルとともに intern() メソッドが言及されているかどうかに関係なく、文字列リテラルは常に intern() メソッドを呼び出します。例えば、

 String s = 'd'.intern(); String p = 'd'; // compiler treats it as String p = 'd'.intern(); System.out.println(s == p); // prints true 

2) を使用して String オブジェクトを作成するたびに、 新しい キーワードを指定すると、2 つのオブジェクトが作成されます。例えば、

 String str = new ('Hello World'); 

ここでは、new キーワードの使用により、SCP の外部のヒープ メモリに 1 つのオブジェクトが作成されます。文字列リテラル ('Hello World') も取得したので、したがって、リテラルの「Hello World」が SCP 内にまだ存在していない場合、SCP 内に 1 つのオブジェクトが作成されます。