XuLaLa.Tech

首页客户端下载Windows 使用V2Ray 教程SSR 教程Clash 教程

Java Long类型比较相等

2025.04.09

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

文章目录

  • 1 使用引用比较
  • 2 使用.equals()
  • 3 使用Objects.equals()
  • 4 拆箱Long
    • 4.1 使用.longValue()方法
    • 4.2 转换为原始值
  • 5 结论

使用引用比较

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方法,同时做判空处理。

© 2010-2022 XuLaLa 保留所有权利 本站由 WordPress 强力驱动
请求次数:69 次,加载用时:0.665 秒,内存占用:32.19 MB