早上,在牛客看到这么一道关于类型比较与自动装拆箱的笔试题,于是做总结如下:
@Test public void test6(){ Integer i = 42; Long l = 42L; Double d = 42.0; // System.out.println(i==l);//报错Incompatible operand types Integer and Long // System.out.println(i==d);//报错Incompatible operand types Integer and Double // System.out.println(l==d);//报错Incompatible operand types Long and Double System.out.println(i.equals(d)); System.out.println(d.equals(l)); System.out.println(i.equals(l)); System.out.println(l.equals(42L)); }
结果:
false
false
false
true
解释:
前三个用==比较编译不通过,两边类型需要一致。
Integer.equals()方法查看源码发现首先比较类型,然后比较值,因此equals()比较不同类型的肯定是false:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
考点:
1.对于引用类型的变量来说==比较的是地址,equals比较的是value
2.==是在同一类型的基本类型与包装类型比较会自动装拆包,equals不会对比较的数据类型进行转换。
类型比较、拆装箱总结:
1.两个均为包装类
包装类型一致
包装类型内容相等(输出true)
包装类型内容不相等(输出false)
包装类型不一致
编译失败
2.一个包装类型一个非包装类型
包装类和非包装类类型一致
包装类内容相等(会拆箱,输出true)
包装类内容不相等(会拆箱,输出false)
包装类和非包装类类型不一致
如果两类均为数字(如int、long、double、float、char=6) (输出true)
如果一类为数字,一类为字符(char=6) (输出false)
如果一类为八大类型,另一类为String(编译失败)
3.两个均为非包装类型
按照上面拆箱的结果