在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方法,同时做判空处理。
v2ray免流混淆填写教程使用 Docker 部署 Shadowsocks 服务器并配合 ss-redirect 工具v2ray ws ios完整教程及FAQShadowsocks全局代理使用指南v2ray连接虚拟网卡教程bash数组详解程序员副业之sms-activate网站联盟MIUI Clash下载缓慢:原因、解决方法及常见问题解答Shadowsocks连接日志:如何查看并管理网络连接Clash下架了吗?原因、影响和解决方案Voilà一个全面AI驱动的内容助手美版小火箭付费下载方式及节点购买流程详解深入了解shadowsocksr libev altv2ray多用户控流教程Clash代理版本:详细教程与常见问题解答sms-activate proxy是一个俄罗斯HTTP/SOCKS5代理服务Clashx对系统有什么要求?机场测速观察---ARKPython每日一题|输入判断 Python每日一题机场优惠 码丨付费的节点梯子加速器购买折扣丨实时更新