资讯专栏INFORMATION COLUMN

为什么Integer比较要用equals

vspiders / 1315人阅读

摘要:昨晚与一同事聊天,他正在找工作,让我问他点常见面试题,然后发现他对的实现原理不是太清楚,他错误地以为只要不超过范围的两个对象就能用进行比较,但其实并不是这样的这里先上一个例子运行结果如下下面说一下,原理实现内部有一个静态变量池存放了一个

昨晚与一同事聊天,他正在找工作,让我问他点常见面试题,然后发现他对Integer, Long, BigDecimal的实现原理不是太清楚,他错误地以为只要不超过范围(-128 ~ 127)的两个对象就能用==进行比较,但其实并不是这样的;

这里先上一个例子:
public static void main(String[] args) {

            int test = 3;
            Integer intA = new Integer(3);
            Integer intB = new Integer(3);
            Integer intC = 2 + 1;
            Integer intD = 52 -49;
            Integer intE = 3;
            Integer intF = test;

            System.out.println(intA == intB);
            System.out.println(intA == intC);
            System.out.println(intC == intB);
            System.out.println(intC == intD);
            System.out.println(intC == intE);
            System.out.println(intD == intE);
            System.out.println(intD == intF);

}
运行结果如下:
false
false
false
true
true
true
true
下面说一下,原理实现
Integer 内部有一个静态变量池 IntegerCache, 存放了一个数组Integer[], -128 ~ 127;
普通的两个值运算都会进行自动拆箱,再进行自动装箱,自动装箱使用的是valueOf方法,Integer.valueOf方法在实现时如果不超过范围(-128 ~ 127)则从 IntegerCache 中获取缓存的Integer对象; 如果超过范围则是new 一个新Integer对象

从IntegerCache池子中取到的对象同一个因此可以用 == 进行比较, 例如:
Integer intD = 52 -49;
Integer intE = 3;
这两个都是从IntegerCachek中取的同一个对象,因此可以进行 == 比较;

而使用构造函数的,则不会从IntegerCache中取, 例如
Integer intA = new Integer(3);
Integer intB = new Integer(3);
他是两个新的Integer对象,尽管value也是在-128~127之间,但并不是从静态变量池 IntegerCache中取的,因此,此时如果用 == 判断则为false;

总结:
两个条件都满足的情况下才可以用 == 判断两个Integer对象是否相等
1.值在-128~127之间
2.比较的两个对象都是使用valueOf创建出来的,或者通过数学计算后自动装箱(valueOf)得来的

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74820.html

相关文章

  • Java程序设计笔记

    摘要:对象的自动清除对象回收是由垃圾回收线程负责方法可以要求系统进行垃圾回收,仅仅是建议系统没有析构方法,但的有类似方法系统在回收时会自动调用对象的方法子类的方法可以在里面释放系统资源,一般来说,子类的方法中应该调用父类的方法。 对象的自动清除 对象回收是由垃圾回收线程负责 System.gc()方法可以要求系统进行垃圾回收,仅仅是建议系统 java没有析构方法,但Object的final...

    microcosm1994 评论0 收藏0
  • Object类入门这一篇就够了!

    摘要:如果我们想要多次输出类中的成员信息,就需要多次书写方法每用一次就得写而调用就简单多了补充两者等价输出结果。注一般选择重写方法,比较对象的成员变量值是否相同,不过一般重写都是自动生成。 第三阶段 JAVA常见对象的学习 第一章 常见对象——Object类 引言: 在讲解Object类之前,我们不得不简单的提一下什么是API,先贴一组百度百科的解释: API(Application Pro...

    alexnevsky 评论0 收藏0
  • 深入浅出了解“装箱与拆箱”

    摘要:本章部分内容从源码中解读一些自动装箱与拆箱的原理,以及会出现的一些陷阱已经性能等。例题分析我们通过几个经典的问题,来看看大家到底理解了装箱与拆箱的知识点没。 showImg(https://img-blog.csdnimg.cn/20190426221838971.gif);showImg(https://img-blog.csdnimg.cn/20190426221918208.pn...

    FullStackDeveloper 评论0 收藏0
  • java的equal和==的区别(转载的)

    摘要:更好的办法把所有的都到缓冲池去吧最好在用到的时候就进行这个操作然后就可以用比较两个字符串的值了二简单数据类型和封装类中的和为每一个简单数据类型提供了一个封装类,每个基本数据类型可以封装成对象类型。 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。 ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...

    cncoder 评论0 收藏0
  • 深入探究Java中equals()和==的区别是什么

    摘要:相等判断符介绍相等判断符用于比较基本数据类型和引用类型数据当比较基本数据类型的时候比较的是数值当比较引用类型数据时比较的是引用指针判断基本类型是否相等首先基本数据类型指的是中的八大数据类型这八大基本数据类型有个共同的特点是它们在内存中是有具相等判断符==介绍   ==相等判断符用于比较基本数据类型和引用类型数据. 当比较基本数据类型的时候比较的是数值, 当比较引用类型数据时比较的是引用(指...

    liaorio 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<