“长”与“长”的比较

nim*_*o23 9 java primitive autoboxing equals

我想将一个long值(原始类型)与另一个Long值(包装类型)进行比较:

long x = 5;
Long y = 5L;

// version 1: only safe, if x is a primitive type
var isEqual = x == y;

// version 2: y needs to be converted to its primitive type
var isEqual = x == y.longValue();

// version 3: using Object.equals(), x will be converted to its wrapper type
var isEqual = Objects.equals(x, y);
Run Code Online (Sandbox Code Playgroud)

问题是:使用版本 2代替版本 3有什么好处吗?

man*_*uti 12

的优点Objects.equals(x, y)是它涵盖了 null 情况。如果变量为 null,前两个将抛出 NPE Long

另一方面,Objects.equals(x, y)会自动装箱long(原始)参数,从而创建一个对象。但通常情况下这不应该是一个问题。

所以:只是Objects.equals()因为比较涉及包装器对象并保持代码简单易读,否则只需在将基元与 进行比较之前检查是否可为空Long.longValue()