より一般的なルールは、コードを必要以上に複雑にしないことです。
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
===