Java文字列の格納場所に関する疑問
仅有的幸福
仅有的幸福 2017-05-17 10:00:54
0
6
687

次のような質問があります:

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 はヒープまたは定数プールを指していますか? 定数プール内の変数を再利用できますか?

仅有的幸福
仅有的幸福

全員に返信(6)
过去多啦不再A梦

リーリー

String インスタンスが intern() メソッドを呼び出すと、定数プールに同じ文字列定数があるかどうかがチェックされ、存在しない場合は、str に等しい文字列が定数に追加されます。 s2 はすでに定数プール内にあるため、s1.intern() はそれを再度作成せず、同じ「aaa」を直接参照します。

これが十分に明らかでない場合は、実験してみましょう、

リーリー

次にコマンドライン

定数プールには VV があることに注意してください

いいねを押す +0
PHPzhong

質問 1:

String a = "aaa" は、定数プールにオブジェクトを作成します。同じオブジェクトが定数プールに存在する場合、a はそのオブジェクトを直接指します。 String a = new String("aaa") は、定数プールに存在する場合、定数プールには作成されず、ヒープにのみ作成されます。

リーリー

質問 2:

ソース コードから答えを見つけてください。 String s3 = "aa".concat("a"); は実際には String s3 = new String("aaa") と同等であり、ヒープ内にオブジェクトを作成します。

リーリー
いいねを押す +0
伊谢尔伦

String は値が割り当てられるたびに新しい String オブジェクト インスタンスを作成するわけではありませんか?だからこそStringBuilderがあるのです。

いいねを押す +0
左手右手慢动作

オブジェクト指向の考え方によれば、定数プールにオブジェクトを同時に作成するかどうかは String 自体が最もよく知っていると考えられます。そうですね、それは intern() メソッドを持っています。

いいねを押す +0
漂亮男人

これまでのいくつかの回答はすでに非常に優れています。私たちがよく言う「文字列を定数プールに入れる」とは、文字列の参照を文字列定数プール (文字列プール、本質的には文字列プール) に入れることを指します。ハッシュ テーブル)、文字列自体は依然としてヒープ上に配置されます。

いいねを押す +0
过去多啦不再A梦

リーリー

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート