Java Long类型比较相等

在Java开发的过程中经常会碰到两个数值的比较,其中整形Integer的比较很简单,直接==就可以了,但是长整形Long的比较,容易忽略从而掉到坑里,是使用==还是equals, 还是有其他的方法来比较。

long compare

使用引用比较

Long是原始类型long的包装类由于它们是对象而不是原始值,我们需要使用.equals()而不是引用比较运算符 (==)来比较Long实例的内容。

在某些情况下,我们可能会认为 == 是可以的,但看起来是骗人的。考虑到我们可以使用 == 低数字:

Long l1 = 127L;
Long l2 = 127L;

assertThat(l1 == l2).isTrue();

但不是更大的数字。如果值超出 -128 到 127 的范围,我们最终会遇到问题,产生完全不同且出乎意料的结果:

Long l1 = 128L;
Long l2 = 128L;

assertThat(l1 == l2).isFalse();

这是因为Java 为-128 和 127 之间的Long实例维护了一个常量池

但是,这种优化并没有给我们使用 == 的许可。在一般情况下,具有相同原始值的两个装箱实例不会产生相同的对象引用。

使用.equals()

解决方案之一是使用.equals()这将评估两个对象的内容(而不是引用):

Long l1 = 128L;
Long l2 = 128L;

assertThat(l1.equals(l2)).isTrue();

使用Objects.equals()

使用equals()的问题是我们需要小心不要在null引用上调用它。

幸运的是,我们可以使用一个null安全的实用方法Objects.equals()

让我们看看它在实践中是如何工作的:

Long l1 = null;
Long l2 = 128L;

assertThatCode(() -> Objects.equals(l1, l2)).doesNotThrowAnyException();

正如我们所看到的,如果我们想要比较的任何Long为null,我们不需要担心。

在底层,Objects.equals()首先使用 == 运算符进行比较,如果失败,则使用标准的.equals()。

拆箱Long

使用.longValue()方法

接下来,让我们使用“==”比较运算符,但以一种安全的方式。Number类有一个方法.longValue()可以解开原始的long值:

Long l1 = 128L;
Long l2 = 128L;

assertThat(l1.longValue() == l2.longValue()).isTrue();

转换为原始值

拆箱Long的另一种方法是将对象转换为原始类型。因此,我们将提取原始值,然后我们可以继续使用比较运算符:

Long l1 = 128L;
Long l2 = 128L;

assertThat((long) l1 == (long) l2).isTrue();

对于.longValue()_方法或使用强制转换,我们应该检查对象是否为null。如果对象为null ,可能会有抛异常NullPointerException。

结论

Java中Long的比较不要使用==,建议使用.equal方法,同时做判空处理。

在Linux中读取带有空格的文件名
Linux crontab命令详解
标签:

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

31 + 1 =

ajax-loader