ホームページ  >  に質問  >  本文

Java文字列の格納場所に関する疑問

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

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

仅有的幸福仅有的幸福2713日前668

全員に返信(6)返信します

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-17 10:02:54

    リーリー

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

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

    リーリー

    次にコマンドライン

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

    返事
    0
  • PHPz

    PHPz2017-05-17 10:02:54

    質問 1:

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

    リーリー

    質問 2:

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

    リーリー

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-17 10:02:54

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

    返事
    0
  • ringa_lee

    ringa_lee2017-05-17 10:02:54

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

    返事
    0
  • 漂亮男人

    漂亮男人2017-05-17 10:02:54

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

    返事
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-17 10:02:54

    リーリー

    返事
    0
  • キャンセル返事