Categories: 编程

Java Long类型比较相等

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

使用引用比较

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

5.0
01
在Linux中读取带有空格的文件名
Linux crontab命令详解
嘻嘻

嘻嘻IT: 笔者是一个工作七八年的程序猿老鸟,从事涉及的技术栈主要包括PHP、Linux、Devops等,喜欢研究新技术,尝试新技术,提升技术自动化和开发效率,致力于write less,do more! 技术每年都会层出不穷,领域划分的越来越细,不可能学习所有的东西,保持对技术的好奇心,理解技术中核心思想,做一个有深度,有思想的开发!

Recent Posts

Clockwise一款AI日历工具

Clockwise是一款创新的…

16小时 ago

IT Tools一款开发人员的实用开源在线工具(11.5k stars)

IT Tools是一款免费且开…

16小时 ago

Leonardo一个视觉创意AI生成平台

Leonardo.ai提供了一…

17小时 ago

DupDub一款终极AI内容创作助手

DupDub 是一个一站式内容…

17小时 ago

Murf AI是一款尖端的AI声音生成器

Murf AI是一款尖端的AI…

17小时 ago