Map<String,Integer> m;
m = new TreeMap<String,Integer>();
当m.get()为null时,添加以下强制转换以避免空指针异常是一种好习惯。
System.out.println( ((Integer) 8).equals( m.get("null") ) ); // returns false
或者使用先前的空检查,它开始看起来有点难看。
System.out.println( m.contains("null") != null && m.get("null").equals( 8 ) );
有没有更好的方法来写这个?感谢。
答案 0 :(得分:4)
==
运算符不会比较值,而是引用。
您应该使用.equals()
方法,而不是应用于Integer
变量(您确定不是null
并且NPE不会被抛出):
Integer eight = 8; //autoboxed
System.out.println(eight.equals(m.get("null")));
即使false
返回m.get("null")
,也会打印null
。
答案 1 :(得分:2)
我尽量避免使用强制转换,所以我宁愿使用以下内容,在我看来也更好看:
Integer.valueOf(8).equals(m.get("null"))
答案 2 :(得分:2)
不,因为它不起作用。您无法将两个Integer
与==
进行比较,因为它会比较引用而不是整数值。查看this question
您需要一个辅助方法,例如:
boolean safeIntegerCompare(Integer a, int b)
{
if (a != null)
return a.intValue() == b;
return false;
}
答案 3 :(得分:1)
如果只有一个参数可能是null
(就像您将未知值与常量进行比较时那样),请使用equals()
,如下所示:
Integer foo = Integer.valueOf(8); // you could write Integer foo = 8; here too but I prefer to avoid autoboxing
if (foo.equals(m.get("x"))) { //will never throw an NPE because foo is never null
...
}
请注意,您的示例通常无法正常工作,因为将非原始值与==
进行比较仅在引用同一对象实例时才返回true。 (在这种情况下,甚至可能出于非常具体的原因,但大部分时间都不是。)
答案 4 :(得分:0)
为了扩展接受的答案:我发现自己必须检查 2 个整数变量的相等性,这些变量可能为空,也可能不为空。
所以我的解决方案是:
<块引用>布尔等于 = Optional.ofNullable(objectA.getNullableInteger()).equals(Optional.ofNullable(objectB.getNullableInteger());