以下のコード行を実行しようとしています。私の理解は、#1と#2の両方が文字列プール内の文字列を生成する必要があるため、両方の実行に違いはないはずですが、ヒープダンプを解析すると、intern()の文字列がStringプール(限られた数の文字列オブジェクトで解釈できますが)#1の文字列がヒープ上に生成されている(ヒープダンプに多数の文字列オブジェクトが存在するため)、システムは前のケースよりも高速にメモリを使い果たしています。誰かがそれがなぜそう説明することができますか?私はjava 6を使用して、以下のコード行を実行しています。場合文字列プールで二重引用符を使用して生成された文字列が生成されない
import java.util.LinkedList;
public class LotsOfStrings {
private static final LinkedList<String> LOTS_OF_STRINGS = new LinkedList<String>();
public static void main(String[] args) throws Exception {
int iteration = 0;
while (true) {
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 1000; j++) {
String s= "String " + j;
LOTS_OF_STRINGS.add(s); // #1
//LOTS_OF_STRINGS.add(new String("String " + j).intern()); //#2
}
}
iteration++;
System.out.println("Survived Iteration: " + iteration);
Thread.sleep(100);
}
}
ヒープダンプオブジェクトのスクリーンショットの場合の場合のインターン intern
ヒープダンプオブジェクトのスクリーンショット#1
文字列プールからの参照を取得しました。それ以外の場合は、プールで使用できる場合のみ、ヒープに文字列を作成します。 – Nir
内部ループの最初の実行中に、1000の一意のStrings String 0 .... to .... String 999を生成する必要があります。この後、プログラムは、最初の実行時に作成された参照を、参照は文字列プールで利用できるはずですか? – Vyas