Java Integer类型比较问题

Java Integer类型比较问题JavaInteger类型比较问题【强制】所有整型包装类对象之间值的比较,全部使用equals方法比较。说明:对于Integervar=?在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。—-阿里巴巴Java开发手册抱着探索的精神我们来看

大家好,又见面了,我是你们的朋友全栈君。

Java Integer类型比较问题

【强制】所有整型包装类对象之间值的比较,全部使用 equals 方法比较。
说明:对于 Integer var = ? 在-128至127范围内的赋值,Integer 对象是在 IntegerCache.cache产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。
—- 阿里巴巴Java开发手册

抱着探索的精神我们来看看java.lang.Integer这里面的逻辑
在780行的时候我们发现IntegerCache这个内部类

private static class IntegerCache { 
   
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static { 
   
        // 默认最大值为127
        int h = 127;
        // 然后读取启动参数-XX:AutoBoxCacheMax= 设置的最大值
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        // 如果有配置
        if (integerCacheHighPropValue != null) { 
   
            try { 
   
                int i = parseInt(integerCacheHighPropValue);
                // 取最大
                i = Math.max(i, 127);
                // 不能超过Integer最大值
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) { 
   
                // 如果异常就跳过
            }
        }
        high = h;

        // 分配空间
        cache = new Integer[(high - low) + 1];
        int j = low;
        // 创建缓存, 放到cache里面
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // 再次确保缓存最大值必须大于127
        assert IntegerCache.high >= 127;
    }

    private IntegerCache() { 
   }
}

829行的时候就有使用:

public static Integer valueOf(int i) { 
   
    // 先判断缓存里面存不存在
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

对此我们也写了单元测试验证一下:

public void integerTest() { 
   
    Integer a = 1;
    Integer b = 1;
    System.out.println(a == b);

    Integer a1 = 1234;
    Integer b1 = 1234;

    System.out.println(a1 == b1);
    System.out.println(a1.equals(b1));
    System.out.println(1234 == b1);
}

大家觉得输出结果是什么呢?
是不是true, true,true,true呢?
而真实的结果如下:
在这里插入图片描述
所以所有整型包装类对象之间值的比较,全部使用 equals 方法比较比较靠谱!

以下是个人一些看法
2022-01-25记录

既然你都是Integer对象了,就应该用对象的方式进行判断对比。
PS: Long对象也用了缓存。
在这里插入图片描述
虽然说他们都是可以自己拆箱装箱,那也是要把他们看作是对象。
所有文中说这是一个大坑,我是不敢苟同的!
因为这本身就是一个对象!
== 是用来对比地址的。
equals是用来对比内容的。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160227.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • iOS开发之duplicate symbols for architecture x86_64错误

    iOS开发之duplicate symbols for architecture x86_64错误

    2021年5月27日
  • pycharm的_pycharm conda

    pycharm的_pycharm conda不知道朋友们用过maven没有,使用JAVA编程的人应该有人用过这个有趣的东西,JAVA导包是容易的,然而,懒是没有极限了,所以maven出来了,一个丰满的开发包仓库,不需要你再去哪儿找找找。但是这又算得了什么,我们伟大的Python怎么可能弱,pip包安装管理器就是这样的存在,他使得安装pymodel变得和在linux下安装软件一样容易,只要简单的一句pipinstallsimplename

    2022年8月28日
  • rocketmq的原理_dns原理及其解析过程

    rocketmq的原理_dns原理及其解析过程1如何保证消息的可靠性传输生产者丢失数据:生产者设置同步提交消息,并且手动提交,将消息同步刷盘到从节点后在返回成功,broker:主从复制,同步刷盘消费端:消费重试,只有返回consume_success才算消费完成,保证消息的可靠性,最终还是消费16次还是失败的会进死信队列2.如何保证消息不被重复消费消费端消费消息的幂等1服务端代码根据messageId设置分布式锁,获取锁再做业务操作2更新数据库时校验业务的状态3或者设置唯一索引3.如何保证消息的顺序性…

    2022年10月29日
  • 直和和直积_什么是直积举个例子

    直和和直积_什么是直积举个例子今天又在文章中看到直和和直积的概念,顺手baidu了一下,粘贴下来,其实以前矩阵论有讲过的。。。还是到用的时候印象最深。![在这里插入图片描述](https://img-blog.csdnimg.cn/20200609171605249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODA5NDczMg==,size_…

    2022年10月31日
  • 太极阴,阳虚拟框架—-各种插件大总结(烂尾)[通俗易懂]

    太极阴,阳虚拟框架—-各种插件大总结(烂尾)[通俗易懂]最近心血来潮又想起了折腾自己的安卓手机,不由得就想起来了几年前的Xposed框架.于是又开始跃跃欲试起来然而在网上冲浪许久后,虽然人们七嘴八舌但我大概还是看出来了Xposed对于高版本android好像已经不太能用了,更何况我用的还是MIUI于是,我发现了一个新的玩意—-太极框架.(咳,应该也不是啥新东西了只不过我才关注到而已)当然,现在还有好多类似的东西,但这不是我们的主题….

    2022年6月4日
  • 字符串匹配算法_多字符串匹配

    字符串匹配算法_多字符串匹配文章目录1.BM(Boyer-Moore)算法1.BM(Boyer-Moore)算法思想:有模式串中不存在的字符,那么肯定不匹配,往后多移动几位,提高效率BM原理:坏字符规则,好后缀规则…

    2022年8月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号