Integer比较时用==还是equals

这篇具有很好参考价值的文章主要介绍了Integer比较时用==还是equals。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、==

二、修改integer的缓存范围

三、使用equals


一、==

        一般情况在代码代码中比较interger的值时用==是没有问题的,但是也存在一定的范围。

         可以看到,当Integer表示的值在[-128 ~ 127]之间,使用==时能达到我们的预期的。

        integer用==比较,java基础,java,开发语言

 可是一旦超过这个范围,结果就不是我们想要的了。

integer用==比较,java基础,java,开发语言

 如上图,我们看到一旦integer超过了[-128~127],==比较的结果为false;

这是因为Integer在进行比较的时候会自动的进行拆箱操作,而进行拆箱操作的时候会调用valueOf方法。

        源码:

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

 而IntegerCache.low ~ IntegerCache.high是从IntegerCache中获取的,IntegerCache缓存范围是[-128~127],一旦超出这个范围就得不到预期的结果。

        源码如下:

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

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

二、修改integer的缓存范围

当然这个缓存范围是可以修改的,如下图操作:

-XX:AutoBoxCacheMax=200

integer用==比较,java基础,java,开发语言

 测试:

        修改自动拆箱的缓存最大值为200时,得到验证。

        integer用==比较,java基础,java,开发语言

三、使用equals

        integer用==比较,java基础,java,开发语言

         分析:

        equals方法底层调用了intValue()方法。

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

         结论:在使用Integer比较数值相等时,建议使用equals。文章来源地址https://www.toymoban.com/news/detail-630503.html

                    

到了这里,关于Integer比较时用==还是equals的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java基础二十二(对集合元素排序比较)

    1. 使用 Comparable 接口实现默认排序 Comparable 是 Java 中的一个接口,用于定义对象之间的排序规则。 实现了 Comparable 接口的类可以比较其对象的大小(包装类都实现了该接口),从而可以在集合类(如 TreeSet、TreeMap 等)中进行排序和查找操作。这种排序被称为类的自然排序,

    2024年02月10日
    浏览(35)
  • [开发|java] java 比较两个对象的指定属性的值是否相等

    Java中比较两个对象的指定属性的值是否相等,可以使用Apache Commons Lang库中的EqualsBuilder类。EqualsBuilder提供了一种便捷的方法来比较两个对象的属性值是否相等,具体步骤如下: 通过构造器创建一个EqualsBuilder对象。 调用EqualsBuilder对象的append方法,传入需要比较的两个对象以

    2024年02月16日
    浏览(36)
  • 【Java基础】BIO/NIO/AIO的详细介绍与比较区分

    BIO 全称 Blocking I/O,它是 JDK 1.4 之前的传统IO模型,是一种同步阻塞的IO,线程发起 IO 后,一直阻塞,直到缓冲区数据就绪后,在进入下一步操作 BIO存在的问题: 无法应对高并发的场景 连接建立后,当前线程没有数据可读就会阻塞,造成资源浪费 BIO适用场景: 客户端连接数

    2024年01月20日
    浏览(26)
  • 升级还是不升级?iPhone 15和iPhone 14 Plus性能比较

    预览iPhone 15 Pro Max与三星Galaxy S23 Ultra之战是有正当理由的。显然,三星的旗舰智能手机为2023年的所有其他旗舰产品定下了基调——由于其超长的电池寿命和一流的摄像头,证明了它是最受欢迎的产品。 毫不奇怪,Galaxy S23 Ultra不仅是最好的照相手机之一,也是花钱能买到的最

    2024年02月11日
    浏览(31)
  • Java中Integer方法

    本专栏是自己学Java的旅途,纯手敲的代码,自己跟着黑马课程学习的,并加入一些自己的理解,对代码和笔记 进行适当修改。希望能对大家能有所帮助,同时也是请大家对我进行监督,对我写的代码进行建议,互相学习。 Integer类提供了许多方法来操作整数值。 定义 分析

    2024年02月14日
    浏览(36)
  • Java --- Integer.parseInt()

    parseInt() 方法是java.lang 包下Integer 类的一个方法。 Java Integer parseInt() 方法共有三种不同类型,可以根据其参数进行区分。 以下是 parseInt() 方法的声明: 数据类型 参数 描述 必需/可选 String s 它是一个需要转换为等效整数的字符串。 Required int radix 解析字符串时使用的基数 Re

    2024年02月16日
    浏览(26)
  • 机械女生,双非本985硕,目前学了C 基础知识,转嵌入式还是java更好?

    作为单片机项目开发的卖课佬,个人建议,先转嵌入式单片机开发方向,哈哈。 java我也学过,还学过oracle、mysql数据库,只是当时没做笔记,找不好充分的装逼证据了。 从实习通过业余时间,学到快正式毕业,真的有种呕心沥血的感觉。 当时还是学生,脸皮比较薄,又不是

    2024年03月16日
    浏览(42)
  • java Long 转Integer

    要将 Java 中的 Long 类型转换为 Integer 类型,您可以使用 Integer 类中提供的 intValue() 方法。 例如,假设您有一个 Long 类型的变量 longValue,您可以使用以下代码将其转换为 Integer 类型: 请注意,如果 Long 类型的变量 longValue 超出了 Integer 类型的范围,即超过了 -2147483648 到 21474

    2024年02月11日
    浏览(32)
  • Verilog基础:表达式中的整数常量(integer)

    相关文章 Verilog基础专栏 https://blog.csdn.net/weixin_45791458/category_12263729.html ​         整数常量可以由十进制、十六进制、八进制或二进制格式指定。         整数常量有两种表现形式。         第一种表现形式是一个简单的十进制数,应指定为0到9的数字序列,可以选

    2024年02月08日
    浏览(37)
  • 升级iPhone 15 Pro Max还是等待下一代?看看我们的比较分析!

    对于拥有13 Pro Max并即将结束两年合同的用户,或者任何想看看是否值得购买两年前非常好的旗舰iPhone的最新机型的人来说,分解iPhone 15 Pro Max与iPhone 13 Pro Max的差异非常重要。无论你的动机是什么,我们都会帮助你找到答案。 iPhone 15 Pro Max还没有发布,但很快我们就会知道哪

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包