String.intern の原則
String.intern():
このメソッドはネイティブ メソッドです
基礎となるメソッドは C の StringTable::intern メソッドを呼び出すことで実装されます
intern() メソッドが str.intern()
ステートメントを通じて呼び出される場合、JVM は現在のクラスの定数プール内を検索して、str
と同じ値を持つ文字列があるかどうかを確認します。存在する場合は、定数プール内の対応する Strnig を直接返します。 Reference
存在しない場合は、同等の String
が定数プール内に作成され、定数プール内のこの String の参照が返されます。返品される可能性があります
- - - - - - - - - - - - - - - - ------------------------
したがって、これらが同等の String オブジェクトである限り、
intern() メソッドを使用すると、同じ String 参照が返されます。定数プール
したがって、これらの同等の String オブジェクトは、 intern() を渡した後に == を使用します。 JDK6 の
String.intern() と一致します。
JDK6 の定数プールJdk6はPermGen(永続世代)にあります
注意事項:
PermGenは主にロードされたクラス情報や文字列プールの固定サイズ領域を格納するために使用されるブロックです
-------------- ------------------ -------------------------------- --------
intern() メソッドを実行するとき
定数プールに同等の文字列がない場合、JVM は定数プールに同等の文字列を作成してから、文字列への参照
さらに、JVM は自動的に定数に文字列を追加します。以前に使用した文字列のコレクションをプールに保存します。
Jdk6 で intern() メソッドを使用する場合の主な問題は、定数プールがPermGen に保存されます (永続世代)まず、PermGen は固定サイズの領域ですが、一般に PermGen のデフォルトのサイズはプラットフォームによって異なります。およそ 32M から 96M の間です。
したがって、制御されていないランタイム文字列 (ユーザー入力情報など) に対して intern() メソッドを使用することはできません。
そうしないと、PermGen メモリ オーバーフローが発生する可能性があります。
次に、String オブジェクトは Java ヒープ領域に格納され、Java ヒープ領域と PermGen は物理的に分離されています。
したがって、値が等しくない複数の文字列オブジェクトに対してインターン操作が実行されると、メモリ内に多数の重複文字列が生成されます。 JDK7 の
String.intern()
Jdk7 は、定数プールを PermGen 領域から Java ヒープ領域に移動しました
インターン操作定数プールの場合 文字列がすでに存在する場合は、文字列リファレンスを直接返します。それ以外の場合は、文字列オブジェクトのリファレンスを定数プールにコピーして返します。
ヒープ領域のサイズは、通常制限されません。そのため、定数プールを PremGen 領域から移動します。 ヒープ領域により、定数プールの使用が固定サイズに制限されなくなります。
さらに、ヒープ領域に配置された定数プール内のオブジェクトはガベージ コレクションが可能です
定数プール内の文字列がそれを指さなくなった場合、参照されると、JVM は文字列をリサイクルします
-XX:StringTableSize 仮想マシン パラメータを使用して、文字列プールのマップ サイズを設定できます
文字列pool は内部的に HashMap として実装されている
なので、プログラム内で値を決定できる場合 インターン文字列の数が必要な場合
マップのサイズを必要な数に設定できる*2 (ハッシュの競合を減らす)
これにより、String.intern() は一定の時間と ## 毎回のみを必要とするようになります # String は比較的少量のメモリで文字列プールに格納できます
String.intern() メソッドの関数:
その機能は、手動で文字列を定数プールに入れることです
以上がJavaのString.intern()メソッドの機能は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。