文字列は不変ですが、Java の他のオブジェクトと同様にオブジェクトです。オブジェクトはヒープ上に作成され、文字列も例外ではありません。そう、Strings that are part of the "String Literal Pool" still live on the heap, but they have references to them from the String Literal Pool.
詳細については、このリンクを参照してください
`http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html`
新たに編集:
public class ImmutableStrings
{
public static void main(String[] args)
{
String one = "someString";
String two = new String("someString");
one = two = null;
}
}
メイン メソッドが終了する直前に、ガベージ コレクションに使用できるオブジェクトはいくつありますか? 0? 1? 2?
答えは 1 です。ほとんどのオブジェクトとは異なり、文字列リテラルは常に文字列リテラル プールから参照されます。つまり、それらは常にそれらへの参照を持っているため、ガベージ コレクションの対象にはなりません。
ローカル変数の 1 つまたは 2 つが String オブジェクトを参照しておらず、String Literal Pool からの参照が残っています。したがって、オブジェクトはガベージ コレクションの対象にはなりません。オブジェクトは、intern() メソッドを使用して常に到達可能です。