4

ヒープの PermGen 領域にある文字列プールの概念を知っています。だから私たちが何かをするとき

String firstString = "Stack";
String secondString = "Stack";

プール内の同じオブジェクトへの参照firstStringとポイントの両方。しかし、 intsecondString型の変数についても同じことを試しました。

    int firstInt = 5;
    int secondInt = 5;

    if(firstInt == secondInt) {
        System.out.println("Both point to same allocated memory");
    } else {
        System.out.println("Both point to different allocated memory");
    }

そして結果はBoth point to same object、私が試したときです

Integer firstInteger = new Integer(2);
Integer secondInteger = new Integer(2);

    if(firstInteger == secondInteger) {
        System.out.println("Both point to same object");
    } else {
        System.out.println("Both point to different object");
    }

出力はBoth point to different object

charについても同じことを試しましたが、結果は似ています。だから私の質問は、のようなすべてのプリミティブ型のプールがありますintchar? new ()そして、上記の 2 番目のケースのように同じコンテンツのオブジェクトを実際に作成すると、そのオブジェクトは複製されて同じプール領域に格納されますか、それともプール外ですか?

4

5 に答える 5

11

あなたの投稿には非常に多くの誤解があり、説明を開始することさえ困難です. まともな本を手に入れてください。今のところ、あなたを助けるかもしれないいくつかの事実:

  • 文字列はプリミティブ型ではなく、
  • プリミティブ型への参照が存在できないため、プリミティブ型のプールはありません (それらがスタックにのみ保持されているという答えは明らかに間違っています!)
  • を使用する場合はnew、とにかくプールをバイパスします。そのため、実行するnew String("ala")と常に新しい String オブジェクトが作成されます。のセマンティクスを変更することはできませんnew
  • 利用可能なプールを使用したい場合、オブジェクト ( などInteger.valueOf) でファクトリ メソッドを使用すると、インスタンスがある程度プールされます ( などのすべての可能な値をプールすることは実行可能でも有益でもありませんIntegers) Floats
于 2013-05-24T14:23:43.077 に答える
0

試してみると

if (Integer.valueOf(2) ==Integer.valueOf(2))

あなたが得るでしょうtrue

を使用して、で作成された別のローカル変数Integer firstInt = new Integer(2)に対する新しいローカル変数を作成します。タイプについても同様です。!=Integer secondInt = new Integer(2)String

この背後にある理由==は、変数の等価性をチェックすることです。変数は、「同じ」2 つのオブジェクトを指していても、異なる場合があります (==結果は になります)。falseこのコンテキストでの同じことは、obj1.equals(obj2)返品を意味しますtrue

プリミティブ型のオブジェクト表現と StringS を PermGen に格納する場合は、キーワードを使用しないでくださいnew。つまりInteger firstInt = 2;String firstString= "whatevs";キーワードはヒープnew上にオブジェクトを作成するためです。

于 2013-05-24T14:24:14.147 に答える