0

私は現在、Java の独学コースを受講していますが、質問の 1 つに完全に困惑し、誰かが意味を理解するのを手伝ってくれるかどうか疑問に思っていました...

質問: 次の 3 つのコード セグメントからの出力は何ですか? 違いを完全に説明します。

public static void method2(){ 

    String mystring1 = "Hello World"; 

    String mystring2 = new String("Hello World"); 

    if (mystring1.equals(mystring2)) { 

        System.out.println("M2 The 2 strings are equal"); 

    } else { 

        System.out.println("M2 The 2 strings are not equal"); 

    } 

}

public static void method3(){ 

    String mystring1 = "Hello World"; 

    String mystring2 = "Hello World"; 

    if (mystring1 == mystring2) { 

        System.out.println("M3 The 2 strings are equal"); 

    } else { 

        System.out.println("M3 The 2 strings are not equal"); 

    } 

}

私が与えた答え:

方法 2: "M2 2 つの文字列は等しい" 2 つの別個の文字列であるにもかかわらず、(mystring1.equals(mystring2)) は 2 つの文字列がまったく同じ値を持つことを認識するため、equal を返します。ここで == が使用された場合、それらは 2 つの異なるオブジェクトであるため、等しくないものとして返されます。

方法 3: "M2 2 つの文字列は等しい" 2 つの文字列は、両方ともプール内のまったく同じ文字列を指しているため、等しいです。ここでは == を使用して 2 つの値を調べ、両方の文字がまったく同じであることを認識しています。Hello World が既にプールにあることを認識するため、myString2 をその文字列に向けます。

私は自分の答えにかなり自信を持っていましたが、それは間違っています。何か助けはありますか?

4

3 に答える 3

0

最初の 2 つは等しく、次の 2 つは等しくありません。しかし、それを main() メソッドに入れない限り、出力はまったくありません。

編集:「==」はメモリ内のアドレスを比較するため、2 番目のペアは同じではありません。

于 2013-11-13T13:25:02.740 に答える
0

あなたは最初のものについて正しいです。ただし、2 番目は「M3 2 つの文字列が等しくありません」を返します。これは、== が参照の等価性をテストし、それらが 2 つの異なる変数であるため、等しくないためです。

于 2013-11-13T13:25:17.820 に答える
0

どちらも true を返します。

1) 2 つの新しい文字列オブジェクトが作成されますが.equals、実際の値が比較されることを意味します。これは等しいです。

2) コンパイル時に両方とも定数であるため、1 つの新しい文字列オブジェクトが作成されます。これにより、それらが同じオブジェクトを指すようになります。

この文はあなたの問題かもしれません:

ここでは == を使用して 2 つの値を調べ、両方の文字がまったく同じであることを認識しています。

==値の等価性を説明しているときに、参照の等価性をチェックします。

于 2013-11-13T13:29:11.850 に答える