1.基本类型之间
先看不同类型的基本类型之间的比较:
private static void test2(){
int a = 100;
long b = 100L;
boolean result = b == a;
System.out.println(result ? "相等" : "不相等");
}
结果是:
相等
这里实际上进行了隐式类型转换,编译器将 int 类型“提升”为 long 类型后进行比较,相当于:
boolean result = b == (long)a;
2.包装类与基本类型
再看包装类与基本类型:
private static void test1() {
Integer a = Integer.valueOf(100);
long b = 100L;
boolean result = b == a;
System.out.println(result ? "相等" : "不相等");
}
输出:
相等
当包装类与基本类型进行比较时,编译器会将包装类先解包为基本类型,然后再进行隐式类型转换(如果类型不同的话)后比较。
相当于:
boolean result = b == (long)a.valueOf();
3.包装类之间
最后看不同类型的包装类之间的比较:
private static void test3() {
Integer a = Integer.valueOf(100);
Long b = Long.valueOf(100L);
// boolean result = b == a;
// System.out.println(result ? "相等" : "不相等");
}
被注释部分代码报错,无法通过编译。因为 == 操作符两边的类型必须相同,或者是编译器进行隐式类型转换后相同的类型。
这里两个包装类类型不相同,且编译器也不会同时将这两个包装类解包并进行类型转换后比较,因为解包操作只会发生在包装类和基本类型的比较时。这样做是有意义的,如果两个对象比较也会存在解包,可能会导致代码执行结果与你的预期不符。
你可能期望使用 equals 方法进行比较:
private static void test5() {
Integer a = Integer.valueOf(100);
Long b = Long.valueOf(100L);
boolean result = b.equals(a);
System.out.println(result ? "相等" : "不相等");
}
输出:
不相等
遗憾的是包装类的 equals 方法并不是很“智能”,它们只能用于比较同类,并不能用于比较类型不同的数值类型的包装类。
3.1.方式一
如果要比较两个不同类型的包装类,最简单的方式是将其中一个包装类转换为基本类型后进行比较:
private static void test4() {
Integer a = Integer.valueOf(100);
Long b = Long.valueOf(100L);
boolean result = (long)b == a;
System.out.println(result ? "相等" : "不相等");
}
输出:
相等
此时另一个包装类型会被自动解包,并且编译器会进行合适的隐式类型转换。
3.2.方式二
或者你也可以选择更麻烦一些的方式——将另一个包装类对象“转换”为类型相同的包装类对象后用 equals 方法进行比较:
private static void test6() {
Integer a = Integer.valueOf(100);
Long b = Long.valueOf(100L);
boolean result = b.equals(Long.valueOf((long)a));
System.out.println(result ? "相等" : "不相等");
}
输出:
相等
实际上这里的显式类型转换(long)a
可以省略:
boolean result = b.equals(Long.valueOf(a));
因为Long.valueOf
接收的是long
类型参数,这里 a 会自动解包为 int 类型,然后通过隐式类型转换变为 long 类型。
当然,相比之下这样做太过繁琐,更推荐使用类型转换和==操作符的方式。
文章评论