所学知识

这里涉及到的知识点为Java的自动装箱、拆箱问题


先看简单示例:

第一组输出为true,第二组false,第三组false。第二组false很正常因为Integer对象地址不同,但为什么第一组与第三组结果不同,不是应该一样的吗?

 Integer a = 127;Integer b = 127;System.out.println(a == b);Integer c = new Integer(128);Integer d = new Integer(128);System.out.println(c == d);Integer e = 128;Integer f = 128;System.out.println(e == f);


知识探索:

要弄明白这个问题,首先要熟练掌握Java自动装箱、拆箱相关的知识,Java中的自动装/拆箱发生在运算操作和比较操作时,例如:

 Integer a = 10;a = a + 2;System.out.println(a > 10);

a = a + 2; 先把a拆箱为int类型,再进行a + 2运算,再把结果装箱为Integer类型。

当使用==来比较时有三种情况:

 Integer a = 10;Integer b = 10;Integer c = new Integer(12);Integer d = new Integer(12);System.out.println(a == 10);System.out.println(a == b);System.out.println(c == d);


1、 a == 10 左右两边一边int类型一边Integer类型,a先拆箱再比较。
2、 a == b 与 c == d都是对地址进行比较,不同的是a、b都指向同一对象,Integer a,b=10;中的10存放在常量区,a,b 都指向它。c, d中的new Integer()在堆中产生两个不同对象,地址不同因此返回false。


为什么(Integer)127 == (Integer)127 和 (Integer)128 == (Integer)128的值不同:

Integer类部分源码如下:

 private static class IntegerCache {static final int low = -128;static final int high;static final Integer[] cache;private IntegerCache() {}static {int var0 = 127;String var1 = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");int var2;if (var1 != null) {try {var2 = Integer.parseInt(var1);var2 = Math.max(var2, 127);var0 = Math.min(var2, 2147483518);} catch (NumberFormatException var4) {}}high = var0;cache = new Integer[high - -128 + 1];var2 = -128;for(int var3 = 0; var3 < cache.length; ++var3) {cache[var3] = new Integer(var2++);}assert high >= 127;}}

大概意思就是:Integer类 -128~127 之间的值都是直接从缓存中取出的,(Integer)127 == (Integer)127两边装箱后,实际指向堆内存中同一个对象,大于127 后就new一个新的对象返回。(Integer)128 == (Integer)128,装箱为引用类型后,没有做缓存,指向堆内存中不同对象,所以比较结果为false。至于为什么要缓存,若不缓存,每次都要new一个新对象,资源消耗多,所以缓存一些常用的数,来减少资源损耗。

参考:https://blog.csdn.net/Rongbo_J/article/details/68947525

(Integer) 128 == (Integer) 128 为false详细解读相关推荐

  1. java int 128 ==_Integer128==128?false,Integer和int使用==比较的总结

    Integer和int使用==比较的总结 System.out.println("_____________________________"); Integer a = new ...

  2. Java: Integer比较127, 128

    Java: Integer用==比较时127相等128不相等的原因 Integer数值在 -128 到 127 之间是从缓存中去取值,所以返回的是同一个对象,可以直接Integer==Integer, ...

  3. Integer缓存范围-128 to 127

    1. 源码 /*** Returns an {@code Integer} instance representing the specified* {@code int} value. If a n ...

  4. MemCache超详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...

  5. MemCache详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...

  6. 经典神经网络论文超详细解读(三)——GoogLeNet InceptionV1学习笔记(翻译+精读+代码复现)

    前言 在上一期中介绍了VGG,VGG在2014年ImageNet 中获得了定位任务第1名和分类任务第2名的好成绩,而今天要介绍的就是同年分类任务的第一名--GoogLeNet . 作为2014年Ima ...

  7. Java的Integer和Integer比较相等

    Integer是包装类(引用数据类型),int是基本数据类型, Integer a=12; Integer b=12; //a==b为true: Integer c=1200; Integer d=1 ...

  8. int、Integer、new Integer和Integer.valueOf()的 ==、equals比较

    Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能. Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Cha ...

  9. Integer i1 = 10;和Integer = new Integer(10);的区别

    首先我们要明白Integer是引用数据类型,是包装类(封装类) 1.5版本之后,存在自动拆装包.他是int类型对应的封装类. Integer是直接继承于Number类间接继承于Object类 ,实现了 ...

最新文章

  1. 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作
  2. linux如何取文件列名,Linux_根据表名和索引获取需要的列名的存储过程,复制代码 代码如下: create proc p - phpStudy...
  3. 程序员的创业陷阱:接私活
  4. OpenGL之深入解析纹理的渲染使用
  5. python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法
  6. 25 张图,1.4 w字!彻底搞懂分布式事务原理
  7. linux 空信息,为什么recv()函数收到空消息?
  8. 深度学习---循环神经网络RNN详解(LSTM)
  9. c语言课程建设与改革,C语言程序设计课程教学改革的研究与实践
  10. iso12233测试方法_ISO12233 Test Chart (ISO12233标准分辨率测试卡)使用说明
  11. 生物信息学常见1000个软件的安装代码
  12. Java设计模式之适配器模式详解
  13. louvain算法 matlab,Community_BGLL_Matlab 复杂网络社团发现算法Louvain的 版本,简单实用,欢迎下载 272万源代码下载- www.pudn.com...
  14. Mac翻译系列软件推荐三:Mate Translate for Mac多国语言翻译工具
  15. access如何保存小数点后_如何设置石材雕刻机原点及断电后怎么保存原点坐标?...
  16. Oracle数据库新增字段
  17. node 使用 cnpm
  18. linux 网络速度非常慢,解决Ubuntu 10.04上网速度慢的问题
  19. Android接腾讯Bugly没有上传崩溃日志
  20. python编程怎么画三角形的外接圆_python画出三角形外接圆和内切圆的方法

热门文章

  1. 【面试锦囊】14种模式搞定面试算法编程题(8-14)
  2. 回声消除的昨天、今天和明天
  3. 聊聊spring tx的EnableTransactionManagement
  4. 使用高防后,服务器还是会受到***这是为什么?
  5. 在Object-C中学习数据结构与算法之排序算法
  6. mysql中json_merge函数的使用?
  7. php ob_flush 和flush
  8. 剑指OFFER之栈的压入、弹出序列(九度OJ1366)
  9. 默认路由-静态路由-动态路由
  10. 玩聚SR和FriendFeed的区别