String str = "Test String";
特別待遇とは関係なく、特別待遇とはInteger i = 10;
何 String s = "Test String";
ですか?これらは文字列リテラルと呼ばれ、jvm の文字列定数プールでメモリを取得します。ガベージ コレクションに関して特別な重要性があるのは、プールされた定数がガベージ コレクションの影響を受けないことです。'str' を null にすると、"Test String" はガベージ コレクションの対象になりません。なぜ?:: JVM は、将来この「テスト文字列」を再利用しようとします。ガベージ コレクション アルゴリズムは、プールされたメモリにあるオブジェクトを除外します。したがって、通常の GC ルールはここでは適用されません。これをチェックしてください:なぜ文字列リテラルはガベージコレクションされないのですか
この処理は、ラッパーのオート ボクシングとはまったく異なります。自動ボクシングは JDK1.5 から導入されました。自動ボックス化と自動ボックス化解除Integer i = 10;
コンパイラがこのステートメントを JVM の内部キャッシュ ラッパー オブジェクトのみに置き換えると、
残りInteger i = Integer.valueOf(10);
の文字列リテラルはそうではないように動作します。内部キャッシュ ラッパー オブジェクトとは
Integer i = 100;
Integer j = 100;
参照 i & j は、単一の既存オブジェクトのアドレスで与えられます。それが理由ですif( i==j) //true
Integer k = 130;
if( i==k) // false
k の値が-128 to 127
整数のキャッシュ範囲を超えているためです。これを確認してください:値の範囲が -128 から 127 の場合の整数ラッパーの動作
上記で、参照 k を無効にすると、そのオブジェクトは文字列リテラルのように同じ処理ではない GC を受けます。i または j を無効にすると、対応するキャッシュされたオブジェクトは、文字列リテラルと同じ扱いである GC の影響を受けません。