3

いくつかのコードを実行すると (後で表示)、文字列 == "1" かどうかを確認し、そうであれば "It's 1!" を出力し、それ以外の場合は文字列を出力するように指示します。

コード:

double shirt3 = Math.random() * 9;
String shirt2 = Double.toString(shirt3);
char shirt1 = shirt2.charAt(0);
String shirt = Character.toString(shirt1);

if(shirt == "1") {
    System.out.println("It's 1!");
} else {
    System.out.println(shirt);
}

出力:

7
4
8
1
7
1
7
7
6
0

4

6 に答える 6

9

使用する必要があります

if (shirt.equals("1"))
    ...

これにより、String オブジェクトの ID ではなく、実際の内容が比較されます。

于 2012-04-08T04:53:57.880 に答える
5

==String の等価性をテストするために使用する Java 初心者の間違いを犯しました。equals代わりにメソッドを使用してください。

より長い説明は==、Java のオペレーターが 2 つのオブジェクト参照が同一であるかどうかをテストすることです。つまり、左右のオペランドが同じオブジェクトかどうかをテストします。しかし、あなたが持っているのは、同じ文字列を含む 2 つの異なる文字列です。それらは「等しい」文字列ですが、同じオブジェクトではありません。

一般的な経験則として、equals文字列の比較には常に を使用する必要があります。

(うまくいく状況もあり==ますが、確実に行うために何をしているのかを本当に理解する必要があります。そして、大多数のユースケースでは、努力やリスクに見合うだけの価値はありません。)

于 2012-04-08T04:54:03.547 に答える
4

Java で 2 つの文字列が同じかどうかを確認するには、次を使用します.equals()

"1" == new String("1") //returns false
"1".equals(new String("1")) //returns true

編集: new String("1") を追加して、新しい文字列を話していることを確認しました。

于 2012-04-08T04:54:06.930 に答える
3

Javaで文字列を比較するにはequalsメソッドを使用する必要があるという事実に加えて

// it't allways a good idea to use constant.equals(...)
// to avoid possible NullPointerExceptions
if ("1".equals(shirt))
    ...

あなたの場合、文字を文字列に変換する必要はありません。単一の文字を比較することもできます。追加の String オブジェクトを作成せずに同じことを行い、equals メソッドを処理する必要はありません。

if (shirt1 == '1')
        ...
于 2012-04-08T05:03:21.370 に答える
2

文字列を比較するには equals を使用します。

if(shirt.equals("1"))
     System.out.println("It's 1!");
    }else{
        System.out.println(shirt);
    }
于 2012-04-08T04:54:31.060 に答える
1

より一般的なルールは、コードを必要以上に複雑にしないことです。

int shirt = (int)(Math.random() * 10); // shirt numbers from 0 to 9.
if(shirt == 1) 
    System.out.println("It's 1!");
else 
    System.out.println(shirt);

これは、==プリミティブを比較するために使用できることを示しています。参照を比較するためにも使用できますが、オブジェクトの内容を比較するためには使用できません。

Double d = 0.1;
Double e = 0.1;
System.out.println("(Double) 0.1 == (Double) 0.1 is " + (d == e));

double x = 0.1;
double y = 0.1;
System.out.println("0.1 == 0.1 is " + (x == y));

プリント

(Double) 0.1 == (Double) 0.1 is false
0.1 == 0.1 is true

これは、Double文字列のように、オブジェクトを比較するときに、オブジェクト==がコンテンツを比較しないことを示しています。

文字列リテラルの場合のように、キャッシュが使用される場合、これらすべてに1つの混乱が生じます。これは、異なる場所で参照される値が、パフォーマンス上の理由から実際には同じオブジェクトを使用することを意味します。

Integer d = 10;
Integer e = 10;
System.out.println("(Integer) 10 == (Integer) 10 is " + (d == e));

int x = 10;
int y = 10;
System.out.println("10 == 10 is " + (x == y));

プリント

(Integer) 10 == (Integer) 10 is true
10 == 10 is true

最初の例は、Java5.0以降が小さな整数のキャッシュを使用するために機能します。(小さな整数のサイズは、コマンドラインパラメーターによって異なります:})

Integer d = -129;
Integer e = -129;
System.out.println("(Integer) -129 == (Integer) -129 is " + (d == e));

int x = -129;
int y = -129;
System.out.println("-129 == -129 is " + (x == y));

プリント

(Integer) -129 == (Integer) -129 is false
-129 == -129 is true

文字列については、文字列リテラルキャッシュが使用されます。また、コンパイラは定数式を単純化するため、異なる方法で記述された文字列を同じにすることができます。

final int one = 1;
int oneB = 1;
String a = "1";
String b = "" + 1;
String c = "" + one;
String d = "" + oneB;

System.out.println(a == b);
System.out.println(a == c);
System.out.println(a == d);

プリント

true
true
false

各文字列の内容は同じですがoneB、定数ではないため、式は実行時に評価され、異なる文字列が生成されます。

IMHO:Javaは開発者から詳細を隠そうとします。実際の参照を実際に比較したい場合は演算子を使用できますが、==呼び出しを行う方が適切な選択でした。equals===

于 2012-04-08T09:47:24.343 に答える