次のような質問があります:
new String("aaa") によって作成されるオブジェクトの数は何ですか?答えは、1つまたは2つ作成することです。理由は、定数領域にaaa変数が存在する場合はヒープに1つだけ作成され、定数領域にaaa変数が存在しない場合は定数領域に1つ作成されるためです。そしてヒープの中に1つ。
しかし、実際のテストの結果には一貫性がありません:
リーリーnew String("aaa") がヒープと定数領域の両方にオブジェクトを作成する場合、なぜ s2 は s1 の定数プールへの参照を直接再利用しないのでしょうか?
補足:
私の考えが間違っていたことが分かりました。s1はヒープ内の要素を指し、s2は定数プールを指すはずなので、両者は等しくないというのが正しいです。テストする方法はありますか? new? String("aaa") は同時に定数プール内にオブジェクトも作成します?
Or String s3 = "aa".concat("a"); この s3 はヒープまたは定数プールを指していますか? 定数プール内の変数を再利用できますか?
リーリー
String インスタンスが intern() メソッドを呼び出すと、定数プールに同じ文字列定数があるかどうかがチェックされ、存在しない場合は、str に等しい文字列が定数に追加されます。 s2 はすでに定数プール内にあるため、s1.intern() はそれを再度作成せず、同じ「aaa」を直接参照します。
これが十分に明らかでない場合は、実験してみましょう、
リーリー次にコマンドライン
定数プールには VV があることに注意してください
質問 1:
String a = "aaa" は、定数プールにオブジェクトを作成します。同じオブジェクトが定数プールに存在する場合、a はそのオブジェクトを直接指します。 String a = new String("aaa") は、定数プールに存在する場合、定数プールには作成されず、ヒープにのみ作成されます。
リーリー質問 2:
ソース コードから答えを見つけてください。 String s3 = "aa".concat("a"); は実際には String s3 = new String("aaa") と同等であり、ヒープ内にオブジェクトを作成します。
リーリーString は値が割り当てられるたびに新しい String オブジェクト インスタンスを作成するわけではありませんか?だからこそStringBuilderがあるのです。
オブジェクト指向の考え方によれば、定数プールにオブジェクトを同時に作成するかどうかは String 自体が最もよく知っていると考えられます。そうですね、それは intern() メソッドを持っています。
これまでのいくつかの回答はすでに非常に優れています。私たちがよく言う「文字列を定数プールに入れる」とは、文字列の参照を文字列定数プール (文字列プール、本質的には文字列プール) に入れることを指します。ハッシュ テーブル)、文字列自体は依然としてヒープ上に配置されます。
リーリー