在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()。这将评估两个对象的内容(而不是引用):
Long l1 = 128L;
Long l2 = 128L;
assertThat(l1.equals(l2)).isTrue();使用equals()的问题是我们需要小心不要在null引用上调用它。
幸运的是,我们可以使用一个null安全的实用方法Objects.equals()
让我们看看它在实践中是如何工作的:
Long l1 = null;
Long l2 = 128L;
assertThatCode(() -> Objects.equals(l1, l2)).doesNotThrowAnyException();正如我们所看到的,如果我们想要比较的任何Long为null,我们不需要担心。
在底层,Objects.equals()首先使用 == 运算符进行比较,如果失败,则使用标准的.equals()。
接下来,让我们使用“==”比较运算符,但以一种安全的方式。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方法,同时做判空处理。
Chatgpt Ai工具有什么功能? Chatgpt Ai工具怎么获取?Chatgpt3.5免费版和Chatgpt 4.0plus会员怎么获取?以及账号怎么使用?Shadowrocket连接成功但无法打开:解决方法和常见问题免费VPN:隐藏IP地址的完整指南Cloudflare和V2Ray WebSocket配置与使用教程2024年12月25日:稳定日本(川西神社)电报-Clash流量包机场推荐和韩国(汉拿山)-日本(奈良町)电报-Clash-ssr节点2022 免费美国Apple ID账户共享 – 海外美国服务 美国Apple ID共享在 Shadowrocket 中部署 Trojan 协议的实战经验分享国区App Store中的Shadowsocks:完整使用指南Shadowrocket全局规则详解搭建 Shadowsocks 服务完整指南