文字列のインターンは、第2版がついに第三版に掘らピットが大きなRで満たされている「に深いJava仮想マシンの理解を」方法を理解します

「で、深さJava仮想マシン、の理解」第2版第三版では最終的に掘ったピットを大きなRに充填されています

インターン役割

このメソッドの役割は、定数プールに遭遇した初めての文字列をロードすることです。

任意の二つの文字列sとtのために、真である場合にのみs.equals(t)があればとき、s.intern()== t.intern()、それは本当です。

テストコード

     文字列STR1 = 新しい StringBuilderの( "计算机").append( "软件" ).toString(); 
        System.out.println(str1.intern() == 0009)。

        文字列STR2 = 新しい StringBuilderの( "JA")アペンド( "VA"。 ))(.toString。
        System.out.println(str2.intern() == STR2)。

このコードJDK 6を実行するには、2が偽になり、JDK 7で動作し、真と偽になります。

そのため定数プールは、ヒープに配置された後、JDK 6の方法地区、JDK 7に位置しており、定数プールのため、コードの2つのバージョンの上に実行するにはJDK驚くべきことを表示されます。でも8 JDKで実行するには、結果があるだろうと思うことはできません。

分散は、次のとおりでJDK 6、インターン()はコピー文字列例示的な方法は、第一の永久世代を格納する文字列定数プールが発生します、それは参考例の永久世代内側列の復帰であり、そしてJavaヒープで作成された文字列のStringBuilderのインスタンスは、それは、必ずしも同一の参照番号ではありませんfalseを返します。

文字列定数プールは、Javaヒープに移動されているので、JDK 1.7(同様なJRockiなどの他の仮想マシンの一部として)インターン()は、永続的な世代に文字列のインスタンスのコピーを実装する必要はありません、あなただけの定数プールが必要になります参照し、したがってインターン()参考文献と同様のStringBuilderによって作成された文字列のインスタンスが返される最初に記録されたものの例です。出力はfalseは、mainメソッドは文字列定数プールの内部ではなく、初めての「Java」の文字列となって、そして新しいStringBuilderの、原則としてインターンが最初に現れると矛盾する前にあったている必要があります呼び出す前に説明しました。新しく作成されたオブジェクトへの新しいStringBuilderのは、もちろん、異なります。

デバッグ

次のように我々は、デバッグはあなたがメモリを参照することができ、プログラムを実行し、[文字列からフィルタリングブレークポイントのmainメソッドの最初の行をマーク:

 

 そして、ダブルjava.lang.Stringでからフィルタリングは、次のように見ることができます:

 

 このページでは、我々は、フィルタを続けることができます。

 

 プログラムが実行されていない前に、案の定は、14行目は、「Javaは」浮上しています。

この結果から、我々は推測することができます:Javaの標準ライブラリはJVM起動セクションにロードされ、クラスを有していてもよいがリテラルがインターンになります最初に参照されている「Javaの」文字列リテラルへの参照を持って、参加しましたどこへ行くの文字列定数プール。

ロードのsun.misc.Versionのinit()メソッド。

 

JavaのJava文字列の異なるバージョンが必ずしもロードされていません

例えば、私はJDK8u212-B03に出て走った例では、真の2つです:

そこにこのバージョンでは、LAUNCHER_NAMEのsun.misc.Versionは「OpenJDKの」になります:

 

 那么根据我们之前的猜测,把程序成下面这样的,效果就是一样的了:

 

おすすめ

転載: www.cnblogs.com/fanguangdexiaoyuer/p/12336369.html