前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java避坑记:比较的数字是不同的包装类型,千万注意使用equals方法导致的问题

Java避坑记:比较的数字是不同的包装类型,千万注意使用equals方法导致的问题

作者头像
崔认知
发布2023-06-19 16:03:55
3600
发布2023-06-19 16:03:55
举报
文章被收录于专栏:nobody

Java中,比较两个不同类型的包装类型时候,即使数值相等,使用equals方法也会返回false


示例:

代码语言:javascript
复制
public static void main(String[] args) {
        System.out.println(Objects.equals(1L, 1));
        System.out.println(Long.valueOf(1L).equals(1));
        System.out.println(Integer.valueOf(1).equals(1L));
    }

结果:

从源码分析原因


java.lang.Long#equals

代码语言:javascript
复制
public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }

java.lang.Integer#equals

代码语言:javascript
复制
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

java.util.Objects#equals

代码语言:javascript
复制
public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

其他数字类型源码暂不贴出。

从源码看出,包装的数字类型,使用equals方法的前提必须是:类型一致

如果原生类型存在自动类型转换,或原生类型与包装类型混用比较,很容易导致bug的发生

如何避免


除了类型转换成一致使用equals方法数字类型比较使用compare方法。

示例:

代码语言:javascript
复制
public static void main(String[] args) {
        System.out.println(Objects.compare(1, 1,Integer::compareTo));
        System.out.println(Objects.compare(1L, 1L,Long::compare));
        int a = 1;
        Long b = 1L;
        System.out.println(Long.compare(a,b));
        System.out.println(Integer.compare(a, Math.toIntExact(b)));
    }

结果:

小结


Java中,比较两个不同类型的包装类型时候或原生类型和包装类型混用,即使数值相等,使用equals方法也会返回false。

封装的数字类型,使用equals方法的前提必须是:类型一致,我们必须类型转换成同一类型。

数字类型比较最好使用compare方法。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档