• java Integer数值==


    Java Integer对象的比较

    https://blog.csdn.net/bsbhenry/article/details/90743619

    Integer是java基本数据类型int的装箱类型,面试时有时候会进行数值比较==挖坑,代码如下:

    Integer a = 1000,b=1000;
    Integer c = 100,d=100;
    System.out.println(a==b);
    System.out.println(c==d);
    如果这道题你能得出正确答案,并能了解其中的原理的话。说明你基础还可以。如果你的答案 是 true 和true的话,你的基础就有所欠缺了。
    首先公布下答案, 运行代码,我们会得到 false true。我们知道==比较的是两个对象的引用,这里的abcd都是新建出来的对象,按理说都应该输入false才对。这就是这道题的有趣之处,无论是面试题还是论坛讨论区,这道题的出场率都很高。原理其实很简单,我们去看下Integer.java这个类就了然了。

    public static Integer valueOf(int i) {
    return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
    }

    /**
    * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
    */
    private static final Integer[] SMALL_VALUES = new Integer[256];

    static {
    for (int i = -128; i < 128; i++) {
    SMALL_VALUES[i + 128] = new Integer(i);
    }
    }
    当我们声明一个Integer c = 100;的时候。此时会进行自动装箱操作,简单点说,也就是把基本数据类型转换成Integer对象,而转换成Integer对象正是调用的valueOf方法,可以看到,Integer中把-128-127 缓存了下来。官方解释是小的数字使用的频率比较高,所以为了优化性能,把这之间的数缓存了下来。这就是为什么这道题的答案回事false和ture了。当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。

    再看看下面的代码:

    Integer a = new Integer(1000);
    int b = 1000;
    Integer c = new Integer(10);
    Integer d = new Integer(10);
    System.out.println(a == b);
    System.out.println(c == d);
    这道题是继上面的后续,如果这道题你能很快速的得出答案,那么恭喜你,==比较符你就算掌握的比较透彻了。
    揭晓正确答案: true 、false 。


    看到这个答案很多小伙伴又会不解,先来说下第二个,按上一题来说Integer不是把-128-127缓存起来了吗?这不是应该是true嘛,但是你仔细看,这里的Integer是我们自己new出来的,并不是用的缓存,所以结果是false。 现在来看第一个为啥又是true了呢? 首先这里的值为1000,肯定和我们所知的Integer缓存没有关系。既然和缓存没有关系,a是新new出来的对象,按理说输入应该是false才对。但是注意b这里是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。

  • 相关阅读:
    [OpenJudge] 反正切函数的应用 (枚举)(数学)
    [OpenJudge] 摘花生 (模拟)
    [OpenJudge] 宇航员(模拟)
    [OpenJudge] 显示器(模拟)
    背包问题
    BFS_最短路径
    链表
    网站
    网站
    洛谷_递归整理
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/15849190.html
Copyright © 2020-2023  润新知