一个更一般的规则是不要让代码变得比它需要的更复杂。
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
,像字符串一样,对象==
不会比较内容。
当使用缓存时,所有这一切都会造成混淆,就像字符串文字一样。这意味着出于性能原因,在不同位置引用的值实际上使用相同的对象。
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
第一个示例有效,因为 Java 5.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
不是一个常量,所以表达式在运行时被计算并产生一个不同的字符串。
恕我直言:Java 试图向开发人员隐藏详细信息,如果您真的想比较实际引用,则可以使用操作员进行==
调用,这将是一个更好的选择。equals
===