在Java中,比较可能为null的Integer与int的最简单方法是什么?

11
Map<String,Integer> m;
m = new TreeMap<String,Integer>();

当m.get()为空时,为了避免空指针异常,添加以下转换是否是好的做法。

System.out.println( ((Integer) 8).equals( m.get("null") ) ); // returns false

如果使用之前的空值检查,它开始看起来有点丑陋。

System.out.println( m.contains("null") != null && m.get("null").equals( 8 ) );

有没有更好的写法?谢谢。


这取决于谁还要来参加舞会。 - Hot Licks
6个回答

9
< p > == 运算符不比较值,而是引用。 < p > 相反,您应该使用 .equals() 方法,应用于 Integer 变量(您确定它不是 null 并且不会抛出NPE):

Integer eight = 8; //autoboxed
System.out.println(eight.equals(m.get("null")));

这将打印出false,即使m.get("null")返回null

9

我尽可能避免使用强制转换,因此我更喜欢使用以下方法,我认为这样看起来更好:

Integer.valueOf(8).equals(m.get("null"))

1
当然,它们最终生成基本相同的代码。 "Cast" 实际上是一个自动装箱指令。 - Hot Licks
@HotLicks 这是事实,将原始类型转换为其相应的装箱类型甚至可以进行静态类型检查。出于风格原因,我仍然不喜欢它。当然,OP代码更严重的问题是使用“==”比较整数是否相等,正如其他答案所指出的那样。我必须承认,一开始忽略了这一点,只回答了他关于转换“是否被认为是不好的风格”的直接问题(自那时以来已编辑)。 - 5gon12eder
是的,我猜他最初使用的是==,但很快就将其编辑掉了。奇怪的是,对于小值正整数而言,它实际上是可以运行的,因为它们本质上是“内部化”的。 - Hot Licks

8
不行,因为这样不起作用。你不能使用==比较两个Integer,因为这会比较引用而不是整数值。在这个问题中查看更多信息。
您需要一个辅助方法,例如:
boolean safeIntegerCompare(Integer a, int b)
{
    if (a != null) 
      return a.intValue() == b;
    return false;
}

我不相信他有意这样做(尽管我承认他的完全意图很难揣测)。 - Hot Licks

1
你可以使用 Objects.equals 方法。
int foo = 1;
Integer bar = null;
Objects.equals(foo, bar);

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。(在某些情况下可能由于非常特殊的原因而是真实的,但大多数情况下不是。)

这基本上就是原帖中提出的内容。 - Hot Licks
@HotLicks 当我回答问题时还不是这样,但是问题后来被 OP 编辑了。 - biziclop
是的,我同意这个问题从一开始就措辞含糊,而且他已经修改了大约十几次。现在这个话题变得非常混乱。 - Hot Licks

1
为了扩展已接受的答案:我发现自己不得不检查两个可能为空的整数变量的相等性。
因此,我的解决方案是:
``` boolean equals = Optional.ofNullable(objectA.getNullableInteger()).equals(Optional.ofNullable(objectB.getNullableInteger())); ```

在这里使用Objects.equals是否更容易些呢?boolean equals = Objects.equals(objectA.getNullableInteger(), objectB.getNullableInteger()) - Kariem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接