问题描述
Integer a = 1;
long b = 1L;
System.out.println(Objects.equals(b, a));
//结果:false
原因分析:
Integer的equals方法:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
先判断参数obj是否是Integer类型,如果不是,则直接返回false。如果是Integer类型,再进一步判断int值是否相等。
而上面这个例子中b是long类型,所以Integer的equals方法直接返回了false。
也就是说,如果调用了Integer的equals方法,必须要求入参也是Integer类型,否则该方法会直接返回false。
解决方案:
将参数b的类型强制转换成int,或者将参数a的类型强制转换成long。
Integer a = 1;
long b = 1L;
System.out.println(Objects.equals(a, (int)b));
//结果:true
Integer a = 1;
long b = 1L;
System.out.println(Objects.equals(b, (long)a));
//结果:true
java的8种基本类型包装类的equals都有相同的问题
本文分析了Java中Integer.equals方法的行为,指出当尝试用Integer对象与long类型进行equals比较时,由于类型不匹配,会导致返回false。问题源于Integer.equals方法首先检查参数是否为Integer类型。解决方法是将比较的双方转换为相同的类型。这个情况同样适用于其他基本类型包装类的equals方法。理解这一点对于避免潜在的bug至关重要。
3999

被折叠的 条评论
为什么被折叠?



