-1

まず、SOとGoogleの両方でこれについて検索しました。これがどこかの何かの複製であると言うなら、その何かは本当に到達するのが難しいです。

ええと...文字列はオブジェクトであり、equalsを使用して比較する必要があることはわかっていますよね?

次に、次のことを説明してください。

String s1 = new String("string");
String s2 = new String("string");
String s3 = "string";

System.out.println(s1.equals(s2));  // true
System.out.println(s1 == s2);       // false

System.out.println(s1 == "string"); // false
System.out.println(s2 == "string"); // false
System.out.println(s3 == "string"); // true

出力に関して== "string"、なぜ最後の1つだけが「true」を出力するのですか?

それらが作成されたとき、それらはすべて文字列ではありませんか?今、私の3番目のストリングは醜いアヒルの子ですか?...さらに悪いことに、私が外国の文字列を使用している場合...それは私が思っている文字列ではないかもしれませんか?!(s3はそのString前にあり、プリミティブではないことに注意してください。)

...s3にはオブジェクトが含まれていると確信しています。

言い換えると、次のように文字列を宣言することの違いは何ですか?

String s1 = new String("string");

そしてこのような別のもの:

String s3 = "string";

4

4 に答える 4

3

を実行すると、メモリ内にString s1 = new String("string");新しいStringオブジェクトが作成され、を介して参照が保持されますs1。同様にString s2 = new String("string");、を介して別のStringオブジェクト参照を取得しますs2

==演算子はオブジェクト参照を比較するs1 == s2ため、それらは差分文字列オブジェクトであるためfalseです。

と言うと、内部プールに文字列定数リテラル オブジェクトをString s3 = "string";作成し(文字列クラスは内部プールを維持します)、参照をに割り当てます。s3

以下の仕様の詳細:

すべてのリテラル文字列と文字列値の定数式がインターンされます。文字列リテラルは、 Java言語仕様の§3.10.5で定義されています

と言うと、s3=="string"はと"string"同じStringオブジェクト参照を参照していますs3(Javaは匿名定数リテラルの作成で最適化を行うため、同じ値のリテラルが再度作成されることはありません)。したがって、この比較はになりtrueます。

これはそうではなく、s1それぞれs2がメモリ内の明示的なStringオブジェクトを参照しているためです。

于 2012-12-02T17:43:44.353 に答える
0

コンパイラは、「文字列」などのハードコードされたリテラルを検索し、それらを同じ参照オブジェクトに置き換えます。

他の2つのオブジェクトはでtrueを返す必要equals()がありますが、new演算子を使用しているため、これらはまったく異なるオブジェクトです。

于 2012-12-02T17:41:43.220 に答える
0

Stringタイプの一部の値はインターンStringできます。つまり、同じ値を持つ複数のインスタンスが同じオブジェクトを指すことができます。このようなインスタンス==では正しく機能しますが、intern()明示的に呼び出さない限り、この動作に依存することはできません。

常に印刷される次のスニペットを試すことができますtrue

    String s1 = new String("a").intern();
    String s2 = "a".intern();

    System.out.println(s1 == s2);
于 2012-12-02T17:42:14.457 に答える
0

JavaのSCP(文字列定数プール)について知っていただければ幸いです。newを使用して文字列を作成すると、通常のJavaオブジェクトのように新しい参照が作成されます...しかし、s3 = "string"のように宣言すると、同じ値の文字列に対して1回だけSCPに参照が作成されます。 = "string"これは、新しい参照を作成しない同じ参照を指します。==は参照のみをチェックしますが、.equals()メソッドは値をチェックします。プログラムでは、「string」文字列値はすでにscp領域に格納されているため、s3=="string"をチェックするとtrueが返されます。新しい参照を作成していません。もっとわかりやすい投稿コメントが必要な場合...

于 2012-12-02T18:01:27.627 に答える