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! 技术每年都会层出不穷,领域划分的越来越细,不可能学习所有的东西,保持对技术的好奇心,理解技术中核心思想,做一个有深度,有思想的开发!

Share
Published by
嘻嘻
Tags: Java编程

Recent Posts

全球货币导航网页上线了!

o在全球化的今天,货币兑换和国…

4小时 ago

bash字符串拼接

在编程中,字符串的拼接是一个非…

5小时 ago

Bash Case详解

Bash case 语句通常用…

5小时 ago

Bash for详解

for循环是编程语言中的基础概…

5小时 ago

liunux中你必须知道alias命令?

在Linux操作系统中,无论你…

1天 ago

zshrc文件详解

Zsh 是一个强大的 shel…

2天 ago