ホームページ  >  記事  >  Java  >  Stringオブジェクトのintern()の詳細説明

Stringオブジェクトのintern()の詳細説明

Y2J
Y2Jオリジナル
2017-05-19 09:45:261594ブラウズ

1. まず、String は 8 つの基本データ型に属しません。
オブジェクトのデフォルト値は null であるため、String のデフォルト値も null ですが、これは特別なオブジェクトであり、他のオブジェクトにはないいくつかの特性があります。

2. new String() と new String("") は両方とも、空の文字列であり、null ではありません。
String str=new String (" kvill"); 違い:

ここでは、ヒープやスタックについては説明しません。
定数
プールの単純な概念を簡単に紹介するだけです。 定数プールは、コンパイル中に決定され、コンパイルされた .class ファイルに保存される一部のデータを指します。これには、文字列定数だけでなく、クラス、メソッド、
インターフェース
などの定数も含まれます。 例 1 を見てください:

String s0=”kvill”; 
String s1=”kvill”; 
String s2=”kv” + “ill”; 
System.out.
print
ln( s0==s1 ); 
System.out.println( s0==s2 );

結果は次のようになります:

true 
true

まず第一に、Java は文字列定数のコピーが 1 つだけ存在することを保証することを知る必要があります。

この例の s0 と s1 の「kvill」は両方とも文字列定数であるため、コンパイル時に決定されるため、s0==s1 は true となり、「kv」と「ill」も文字列定数になります。文字列は複数の文字列定数で構成されており、それ自体が文字列定数でなければなりません。そのため、s2 もコンパイル時に文字列定数に解析されるため、s2 は定数プール A
Quote
の「kvill」でもあります。 したがって、s0==s1==s2 を取得します new String() で作成された文字列は定数ではなく、コンパイル時に決定できないため、new String() で作成された文字列は定数プールには入れられません。独自のアドレス空間を持っています。

例 2 を見てください:


String s0=”kvill”; 
String s1=new String(”kvill”); 
String s2=”kv” + new String(“ill”); 
System.out.println( s0==s1 ); 
System.out.println( s0==s2 ); 
System.out.println( s1==s2 );

結果は次のとおりです:

false 
false 
false

例 2 では、s0 は依然として定数プール内の "kvill" のアプリケーションです。s1 はコンパイル時に決定できないため、新しいオブジェクト "kvill" は実行時に作成されます。" 参照。s2 は新しい文字列 ("ill") の後半を持っているため、コンパイル時に決定できません。したがって、新しい

オブジェクト作成

"kvill" のアプリケーションでもあります。 ; これを理解すれば、なぜこの結果が得られるのかがわかります。 4. String.intern():

もう 1 つのポイント: .class ファイル内に存在する定数プールは、実行時に JVM によってロードされ、拡張できます。 String の intern() メソッドは、定数プールを拡張するメソッドです。String インスタンス str が intern() メソッドを呼び出すと、Java は定数プール内に同じ Unicode の文字列定数があるかどうかを確認し、存在する場合は返します。そうでない場合は、定数プールに str に等しい Unicode 文字列を追加し、その参照を返します。例 3 を見ると明らかです。例 3:

String s0= “kvill”; 
String s1=new String(”kvill”); 
String s2=new String(“kvill”); 
System.out.println( s0==s1 ); 
System.out.println( “**********” ); 
s1.intern(); 
s2=s2.intern(); //把常量池中“kvill”的引用赋给s2 
System.out.println( s0==s1); 
System.out.println( s0==s1.intern() ); 
System.out.println( s0==s2 );

結果は次のようになります。 、別のエラーを破ります 理解:

誰かが「String.intern()メソッドを使用して、StringクラスをグローバルStringテーブルに保存します。同じ値を持つUnicode文字列がすでにこのテーブルに存在する場合、このメソッドは、テーブル内に同じ値を持つ文字列がない場合は、テーブルに自分のアドレスを登録します。「グローバル String テーブルを定数プールとして理解すると、彼の最後の文は、「ある文字列がない場合」です。 「テーブルに同じ値がある場合は、テーブルに独自のアドレスを登録してください」は間違っています:

例 4 を見てください:

false 
********** 
false //虽然执行了s1.intern(),但它的返回值没有赋给s1 
true //说明s1.intern()返回的是常量池中”kvill”的引用 
true

結果:

String s1=new String("kvill"); 
String s2=s1.intern(); 
System.out.println( s1==s1.intern() ); 
System.out.println( s1+" "+s2 ); 
System.out.println( s2==s1.intern() );

このクラスには名前がありません "kvill" 定数なので、 s1.intern() を呼び出したとき、最初は定数プールに "kvill" がありませんでしたが、新しい "kvill" 定数が定数プールに追加されましたが、元の定数は定数プールにありませんでした。存在する、つまり「自分のアドレスを定数プールに登録する」のではありません。

s1==s1.intern() は false で、元の "kvill" がまだ存在することを示します。

s2 は定数プール内の "kvill" のアドレスであるため、s2==s1.intern() は true です。 。

5.equals() と == について:


文字列の場合、これは単に 2 つの文字列の Unicode シーケンスが等しいかどうかを比較し、等しい場合は true を返します。== は、そのアドレスが等しいかどうかを比較します。 2 つの文字列は同じです。つまり、それが同じ文字列への参照であるかどうかです。

6. String インスタンスが生成されると変更されないことがわかっている限り、String が不変であることについては多くのことが言えます。例: String str="kv"+"ill"+" "。 +"ans";
文字列定数は 4 つあります。まず、「kv」と「ill」で「kvill」を生成し、メモリに保存します。次に「kvill」と「」で「kvill」を生成します。最後に、「kvill ans」を生成し、この文字列のアドレスを str に割り当てます。これは、String の「不変性」により多くの一時変数が生成されるためです。 【関連おすすめ】

1. Java の無料ビデオチュートリアル

2. Java の intern() メソッドの詳細な分析

3. JAVA の intern() メソッドの使用経験の概要

4. Javaのinternメソッドの概要 概念とは

5. Javaにおけるintern()の役割の分析

以上がStringオブジェクトのintern()の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。