文字列プールに実際に含まれているものについて少し混乱しています。
と言うときString s = "abc"
、これはコンパイル時に文字列オブジェクトが文字列プールに置かれるということですか、それとも置かれるのは参照ですか?
文字列プールは、文字列リテラルの単なるキャッシュです。文字列リテラルを文字列参照に割り当てるたびに、文字列プールでリテラルが検索され、参照変数に割り当てられます。String s="abc"
JVM では、文字列プールでリテラルを検索し"abc"
、その参照を参照変数に割り当てますs
。
____________
refers | |
String s ------->| abc |<---- String Pool
|___________|
ステートメントString s = "abc"
は、abc
まだ存在しない場合、文字列定数プールに作成されます。存在する場合は、参照が返されます。ここで、文字列定数プールに関する優れたチュートリアルを見つけることができます。
http://www.thejavageek.com/2013/06/19/the-string-constant-pool/
ここで「abc」はコンパイル時に定義されるため、自動的にインターンされます。したがって、この文字列オブジェクトは文字列インターン プールに移動します。そこにすでに存在する場合は、その参照が返されます。文字列インターンプールは、Java 7 以降のメイン Java ヒープの一部です (ヒープにオブジェクトが含まれることがわかっています)。