JLS7 15.21 Equality Operators
关于Java中的“==”操作符与“!=”操作符,发现各说纷纭,谁也不信了,保险起见,只好翻E文。别不信,工作多年的朋友也未必能把以下结果全部答对。
参考Page 515:
自己总结一下使用场景如下:
1. 一个操作数是基本数值类型,另一个是包装数值类型;或者两个操作数是同一个包装数值类型。
int a = 200; float b = 200L; System.out.println(a == b);//true
float a = 200; Long b = 200L; System.out.println(a == b); //true
Long a = 200L; Long b = 200L; System.out.println(a == b); //false超过-128-127的cache范围
Integer a = 200;Long b = 200L; System.out.println(a == b); //compile error
int a =200; Number b = 200; System.out.println(a == b); //compile error
float a = 10.000000000000000000000000000000000000f;
float b = 10.000000000000000000000000000000000001f;
System.out.println(a== b); //true
float a = 0.000000000000000000000000000000000000f;
float b = 0.000000000000000000000000000000000001f;
System.out.println(a== b); //false
double a =Double.MAX_VALUE;
double b =Double.MAX_VALUE + 1;
System.out.println(a== b); //true
2. boolean或Boolean类型的两个操作数之间比较。
boolean a = true;Boolean b = true; System.out.println(a == b); //true
Boolean a = true;Boolean b = true; System.out.println(a == b); //true
Boolean a = new Boolean(false); Boolean b = false; System.out.println(a == b);//false
boolean a = true;int b = 200; System.out.println(a == b); // compile error
3. 一个操作数的类型与另一个操作数类型相同,或是其父类型;或者至少有一个操作数是null。
Long a = 200L; Number b = 200; System.out.println(a == b); //false
Long a = 200L; System.out.println(a == null); //false
具体章节摘要如下:
15.21.1 Numerical EqualityOperators == and !=
如果一个操作数是基本数值类型,另一个是包装数值类型,会进行拆箱处理。
如果一个操作数是NaN,那么==的结果就是false。事实上,x!=x当且仅当x是NaN。
-0.0==0.0的结果是true,其他情况下任何两个不同的浮点值==的结果都是false。
原文片段:
15.21.2 Boolean EqualityOperators == and !=
15.21.3 Reference EqualityOperators == and !=
总结:理解好JLS中的这段规则,Java的内存区域,自动拆装箱。
另外,关于String类型的有个类似的讨论,参考:http://developer.51cto.com/art/201009/225071_all.htm