Integer 是Java中的包装类,通常情况下,两个相同值的Integer对象实例用 “==” 运算符进行比较时,返回结果应该是false,但是实际情况却不是这样。

 public static void main(String[] agrs){Integer integer1 = 1;Integer integer2 = 1;System.out.println(integer1==integer2);}
复制代码

运行结果:

这是为什么?

但是稍微改动一下情况就会不同:

    public static void main(String[] agrs){Integer integer1 = 128;Integer integer2 = 128;System.out.println(integer1==integer2);}
复制代码

运行结果:

可以注意到,这两段程序的不同之处仅仅在integer的值上,一个的值是 1 ,另外一个是 128,比较起来的结果完全不同。

这是为什么?

单步调试看一下:

当赋值128时:

Integer = 128 赋值操作得时候跳到了valueOf函数:

在这个if语句中 low和high的值分别是-128和127,所以最后返回给integer1的时候返回的就是一个新的Integer对象实例,在堆中开辟了新的空间,所以 “==” 的结果理所当然是false,也就是预期结果。

当赋值1时:

Integer = 1 赋值操作得时候也跳到了valueOf函数:

那么这个时候由于1在-128到127之间,所以返回的是 IntegerCache.cache 数组里的对象,从源码中可以看到,cache数组的定义如下:

而这段代码是存在于静态代码块里的:

也就是说:在Integer类被加载之后,cache数组就被初始化成了一个储存了-128~127的顺序的Integer数组,按照上面的代码逻辑,所有用 “=” 赋值的操作,如果值在-128~127之间,实际上指向的都是同一个位置。所以 “==” 的返回值是true

转载于:https://juejin.im/post/5c7fc8166fb9a049eb3cb402

Java中Integer包装类之间的比较问题相关推荐

  1. Java中关于包装类的练习题

    Java中关于包装类的练习题 ps:三元运算符.==运算符.Vector的运用等 练习题1: 代码: package OverBaoZhuangLei;import org.junit.Test;pu ...

  2. Java中的包装类缓存

    Java中的包装类缓存 最近在网上看到一个有意思的笔试题目,题目是考察Integer类的valueOf(String s),题目如下: 以下四行代码输出的结果依次是什么? System.out.pri ...

  3. 深入浅出 Java 中的包装类

    转载自   深入浅出 Java 中的包装类 前阵子,我们分享了<Java中的基本数据类型转换>这篇文章,对许多粉丝还是有带来帮助的,今天讲一下 Java 包装类的的由来,及自动装箱.拆箱的 ...

  4. java 中 Integer 比较 问题

    对于 java 中 Integer  类型 比较 ,经常在面试中被提到 ,有时 还真的 让人 头疼.下面我来分析下.integer   比较问题. 解决 Integer 值比较问题.我想从以下几点说起 ...

  5. JAVA中Integer的==和equals

    JAVA中Integer的==和equals注意 "equals"比较 equals(Object obj)方法,在equals(Object obj)方法中,会先判断参数中的对象 ...

  6. java中integer的范围_java中integer取值范围是什么

    java中integer取值范围是什么 发布时间:2020-08-27 10:01:14 来源:亿速云 阅读:69 作者:小新 这篇文章给大家分享的是有关java中integer取值范围是什么的内容. ...

  7. Java 中 Integer 源码学习之缓存池了解

    Java 中 Integer 源码学习之缓存池了解 面试题 new Integer(123) 与 Integer.valueOf(123) 的区别? new Integer(123) 每次都会新建一个 ...

  8. java中Integer的最大最小值

    java中Integer是有最大值和最小值的 最大值为Integer.MAX_VALUE = 2147483647 最小值为Integer.MIN_VALUE = -2147483648 注意:两个值 ...

  9. java中integer取值范围,Java中的Integer取值范围(-2^32 ~ 2^31 - 1)分析

    在Java中Integer的最小值(MIN_VALUE).最大值(MAX_VALUE)定义如下: /** * A constant holding the minimum value an {@cod ...

最新文章

  1. 补充 宝玉 之《URL欺骗之以假乱真!》之 POST 方法提交数据 之 处理!
  2. Python 实现冒泡
  3. Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
  4. 《数字图像处理》冈萨雷斯学习笔记3:频域处理
  5. 百度App Objective-C/Swift 组件化混编之路(一)
  6. German Companies
  7. idea分支如何刷新显示最新
  8. mac终端配置Android ADB命令
  9. [论文阅读] BCNet: Bidirectional collaboration network for edge-guided salient object detection
  10. oracle联合运算,Oracle UNION运算符
  11. python和r语言生物信息学_R语言和Python哪个适合生物信息学?
  12. wamp5环境配置基础教程
  13. 勇闯迷塔小游戏(c++) 3.17更新
  14. 掌门教育秉持因材施教原则,打造个性化教学模式
  15. Chome浏览器播放语音、视频无声音的解决办法
  16. OCI动态链接ORACLE
  17. HTTP Header中的内容(请求Header、响应Header)
  18. 网络表示学习Network Representation Learning/Embedding
  19. 【Java】Java获取昨天日期的正确姿势
  20. 用imu_tk和imu_utils标定imu

热门文章

  1. 腾讯云智能制造首次披露三大战略布局,发布“511”生态伙伴计划
  2. 28 岁退休程序员自述:不是富二代,行政专业出身,非典型程序员
  3. JS 中如何判断 undefined 和 null
  4. 关于Java“回调”的详细理解及使用
  5. 由浅入深CIL系列:6.For和Foreach的CIL结构组成以及运行效率
  6. NeHe OpenGL教程 第四十课:绳子的模拟
  7. python-copy模块使用
  8. effectivec++条款18,让接口容易被正确使用,不宜被吴勇
  9. 聊聊 iOS 中的网络加密
  10. IntelliJ 创建main函数快捷