String s = new String("abc")
これにより、ヒープに新しい String オブジェクトが作成されることはわかっています。しかし、キャシー・シエラによる SCJP の本の声明については混乱しています。
上記のステートメントはヒープにオブジェクトを作成し、同時に文字列「abc」が文字列プールに存在しない場合は、文字列プールに「abc」も追加すると述べています。
上記の場合、オブジェクト「abc」も文字列プールに作成されているかどうか教えてください。
String s = new String("abc")
これにより、ヒープに新しい String オブジェクトが作成されることはわかっています。しかし、キャシー・シエラによる SCJP の本の声明については混乱しています。
上記のステートメントはヒープにオブジェクトを作成し、同時に文字列「abc」が文字列プールに存在しない場合は、文字列プールに「abc」も追加すると述べています。
上記の場合、オブジェクト「abc」も文字列プールに作成されているかどうか教えてください。
はい、そうです。メモリの使用を最適化するために、これを行います。同じ値「abc」で別の変数を作成した場合、新しい変数は、新しい変数を作成するのではなく、以前のものを指します。
どういうわけか、2 つの等しいオブジェクトを作成しないようにしています。
はい、コード内のこの行の前に同じ文字列がないため、作成されます。次に、この例を考えてみましょう。
String temp = "abc"; // line1
String s = new String("abc"); // line2
この場合"abc"
、再作成されません。1行目で作成されたものs
を指します。"abc"
コメントのsujith:しかし、その場合、String temp ="abc"とString temp = new String( "abc")の間に違いは見られません。
1 行目で、ヒープに new"abc"
が作成されます。そして、新しい String オブジェクトが作成され、 に追加されますstack
。そして line2 では、 の line1 で作成された を参照する String の新しいオブジェクト"abc"
が作成されますheap
。何がスタックになり、何がヒープになるのかをよりよく理解するには、こちらをご覧ください。