まず第一に、JDK1.6およびJDK1.7の文字列クラスのインターン方法にまだ違いがあることは明らかです。
JDK1.6のインターン:
最初にINNORメソッドを呼び出すとき、最初のプールに移動して、現在の文字列値が存在するのと同じ値があるかどうかを確認します。存在する場合、定数プールの文字列値への参照を直接返します。それが存在しない場合、元のヒープからの文字列が定数プールにコピーされます。
JDK1.7のインターン:
最初にINNORメソッドを呼び出すとき、最初のプールに移動して、現在の文字列値が存在するのと同じ値があるかどうかを確認します。存在する場合、定数プールの文字列値への参照を直接返します。存在しない場合、一定のプールに元のヒープへの参照を配置するだけで、文字列全体を定数プールにコピーしません。
これは、この文字列が定数プールに存在しない場合、JDK1.6とJDK1.7が異なる方法で処理することを意味します。
以下は、検証して説明する例です。
例:
public static void main(string [] args){string str = "str"+new String( "01"); string str2 = new String( "str01");④str2.intern(); string str4 = "Str01"; JDK1.6では、出力の結果は次のとおりです。
間違い
間違い
間違い
説明する:
実行中に、値「STR01」を持つStringオブジェクトSTRがヒープメモリに作成され、「STR」と「01」定数が定数プールに作成されます。
conster実行するときは、最初に一定のプールに移動して、「STR01」の一定の値があるかどうかを確認し、存在しないことがわかります。 JDK1.6の方法は、定数プールで文字列「Str01」のコピーを生成することです。
contered実行中、「STR01」オブジェクトが定数プールに作成され、すでに存在することが判明しているため、新しいものは作成されません。
最初の出力FALSEの理由は、STRがヒープメモリの「STR01」を指し、STR1が定数プールの「STR01」を指していることです。
exected実行すると、「Str01」の値を持つ文字列オブジェクトSTR2がヒープメモリに作成され、「STR01」の値が定数が定数プールに作成されます。
conster実行するときは、最初に一定のプールに移動して、「STR01」の一定の値があるかどうかを確認します。存在することがわかった場合、この一定の参照を直接返します。
execution実行中、「STR01」の一定の値が定数プールに作成されます。すでに存在することがわかった場合、作成されません。
2番目の出力Falseの理由は、Str2がヒープメモリの「Str01」を指し、Str3が定数プールの「Str01」を指していることです。
execution実行中、「STR01」の一定の値が一定のプールに作成されます。
実行すると、値「Str01」を持つ文字列オブジェクトSTR5がヒープメモリに作成され、「STR」と「01」定数が定数プールで作成されます。
condered実行すると、一定のプールを使用して、「STR01」の一定の値があるかどうかを確認します。見つかった場合、この一定の参照を直接返します。
3番目の出力FALSEの理由は、STR5がヒープメモリの「STR01」を指し、STR4が定数プールの「STR01」を指していることです。
JDK1.7では、出力の結果は次のとおりです。
真実
間違い
間違い
説明する:
最初の出力結果のみが異なることがわかりました。そのため、最初の結果の理由しか説明していません。
実行中に、値「STR01」を持つ文字列オブジェクトSTRがヒープメモリに作成され、「STR」と「01」定数が定数プールで作成されます。 (これはJDK1.6と変わりません)
conster実行するときは、最初に一定のプールに移動して、「STR01」の一定の値があるかどうかを確認し、存在しないことがわかります。 JDK1.7の方法は、ヒープメモリの「STR01」の参照を定数プールにコピーすることです。
contered実行中、「STR01」オブジェクトが定数プールに作成され、すでに存在することが判明しているため、新しいものは作成されません。
この時点で、STRとSTR1は両方ともヒープメモリの「StR01」の値を指しているため、2つは等しくなります。
上記は、JDK1.6およびJDK1.7の文字列クラスのINNANメソッドの比較です。違いがあります。それを必要とする友達はそれを参照できます。