0

重複の可能性:
Java String.equals と ==

Java で文字列を宣言するときに == を使用してこの文字列を比較できず、常に false になるのに、最初から文字列を初期化すると true になるのはなぜですか?

例えば ​​:

import java.util.Scanner;

public class MyString {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    String s = input.nextLine();
    if(s=="Hello")
        System.out.println("Hello");

    String d = "Hello";
    if(d=="Hello")
        System.out.println("Hello");
}

}

この動作の説明は何ですか?

4

5 に答える 5

3

これはString.intern()が文字列リテラルに対して自動的に発生する例ですが、一般的には発生しません。

コードを次のように変更すると

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner input = new Scanner(System.in);
    String s = input.nextLine();
    s = s.intern();
    if(s=="Hello")
        System.out.println("Hello");

    String d = "Hello";
    if(d=="Hello")
        System.out.println("Hello");
}

コンソールで「Hello」と入力すると、「Hello」が 2 回表示されます。これは、「Hello」のすべてのコピーが同じコピーにインターンされているためです。

もちろん、通常は==文字列の比較には使用しないでください。

if (s.equals("Hello")

この「インターン」プロセスは、Java を含む多くの言語でサポートされているメモリ使用量を削減する方法です。ランタイムを呼び出すとs.intern()、インターンされた文字列のプールで文字列のコピーが検索され、見つかった場合は 1 つが使用され、見つからない場合は 1 つが作成されるため、その文字列のコピーは 1 つだけになります。一般的な考え方の詳細については、このウィキペディアの記事を参照してください。

于 2012-11-11T23:19:09.323 に答える
2

を使用しstr.equals(str2)ます。それ以外の場合は、オブジェクトが同じアドレスを持っているかどうかを比較しています。

于 2012-11-11T22:58:19.317 に答える
2

その理由は、によって返される文字列オブジェクトがinput.nextLine()インターンされていないためです。したがって、文字列リテラルで表されるものと同じ文字列オブジェクトではありません"Hello"

次のように「Hello」と入力すると、違いがわかるはずです。

Scanner input = new Scanner(System.in);

String s = input.nextLine();
s = s.intern();

if (s == "Hello") {
    System.out.println("Hello 1");
}

String d = "Hello";

if (d == "Hello") {
    System.out.println("Hello 2");
}
于 2012-11-11T23:15:59.327 に答える
1

.equals()メソッドを使用して、文字列が等しいかどうかを確認します。==2つの参照変数が同じ文字列オブジェクトを指しているかどうかをチェックします。

于 2012-11-11T22:56:02.347 に答える
-1

nextLine()"\n"入力した文字列の末尾にを追加して、「Hello」と等しくないようにします。

于 2012-11-11T22:56:19.680 に答える