点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

来源:Java高效学习

这是一个挺有意思的讨论话题。

如果你运行下面的代码:

Integer a = 1000, b = 1000;
System.out.println(a == b);//1
Integer c = 100, d = 100;
System.out.println(c == d);//2

你会得到

false
true

基本知识:我们知道,如果两个引用指向同一个对象,用 == 表示它们是相等的。如果两个引用指向不同的对象,用 == 表示它们是不相等的,即使它们的内容相同。

因此,后面一条语句也应该是 false 。

这就是它有趣的地方了。如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从 - 128 到 127 之间的所有的整数对象。

所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似——

Integer c = 100;

的时候,它实际上在内部做的是:

Integer i = Integer.valueOf(100);

现在,如果我们去看 valueOf() 方法,我们可以看到

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

如果值的范围在 - 128 到 127 之间,它就从高速缓存返回实例。

所以…

Integer c = 100, d = 100;

指向了同一个对象。

这就是为什么我们写

System.out.println(c == d);

我们可以得到 true。

现在你可能会问,为什么这里需要缓存?

合乎逻辑的理由是,在此范围内的 “小” 整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。

然而,通过反射 API 你会误用此功能。

运行下面的代码,享受它的魅力吧

public static void main(String\[\] args) throws NoSuchFieldException, IllegalAccessException {Class cache = Integer.class.getDeclaredClasses()\[0\]; //1Field myCache = cache.getDeclaredField("cache"); //2myCache.setAccessible(true);//3Integer\[\] newCache = (Integer\[\]) myCache.get(cache); //4newCache\[132\] = newCache\[133\]; //5int a = 2;int b = a + a;System.out.printf("%d + %d = %d", a, a, b); //}
往期推荐居然仅用浏览器,就完成了Spring Boot应用的开发与部署!「赠书」贾扬清推荐,国内首本数据竞赛图书使用IntelliJ IDEA查看类图,内容极度舒适Stack Overflow 2020 开发者调查中的 21 条关键结果Serverless 初体验:快速开发与部署一个Hello World
最后,推荐一个专注分享后端面试要点的公众号「后端面试那些事儿」,置顶标星。每日一篇常问的面试问题,秀的一批~扫描下方二维码关注!

为什么 Java 中 1000==1000 为 false ?相关推荐

  1. java中从1000万个随机数中查找出相同的10万个随机数花的最少时间

    偶然在群里看到有人问到大数据查询,自己也就想了小艾改如何解决,从从1000万个随机数中查找出相同的10万个随机数花的最少时间, 谈到效率,自然是hashmap莫属. import java.util. ...

  2. java中生成1000~10000之间的随机数

    要生成在[min,max]之间的随机整数,可使用Random类进行相关运算: Random random = new Random(); int s = random.nextInt(max)%(ma ...

  3. java中怎么定义true或false_java 中的true、false、null有何不同

    java 中的true.false.null有何不同 发布时间:2020-11-10 15:47:53 来源:亿速云 阅读:92 作者:Leah 这篇文章将为大家详细讲解有关java 中的true.f ...

  4. java中后退键_java - 单击后退按钮两次以退出活动

    java - 单击后退按钮两次以退出活动 我最近在很多Android应用和游戏中都注意到了这种模式:当点击后退按钮"退出"应用程序时,Toast会出现类似于"请再次单击B ...

  5. 为什么 Java 中“1000==1000”为false,而”100==100“为true?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来自: 码农网 译文链接:http://www.codeceo.c ...

  6. 漫话:如何给女朋友解释为什么 Java 中1000==1000为 false,而100==100为 true?

    作者 | 漫话编程 来源 | 漫话编程(ID:mhcoding) public static void main(String[] args) {Integer integer1 = 100; Int ...

  7. java cache缓存_涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?

    为什么 Java 中"1000==1000"为false,而"100==100"为true?  这是一个挺有意思的讨论话题. 如果你运行下面的代码: Integ ...

  8. java cache缓存_为什么 Java 中“1000==1000”为false,而”100==100“为true?

    阅读本文大概需要 2 分钟. 来自: 码农网 为什么 Java 中"1000==1000"为false,而"100==100"为true? 这是一个挺有意思的讨 ...

  9. 为什么Java 中1000==1000为false,而100==100为true?

    本文转载自微信公众号:漫话编程,这是一个通过漫话的形式讲解枯燥的技术知识的公众号,点击下方链接可直接关注. public static void main(String[] args) {Intege ...

  10. java里false是什么意思_为什么 Java 中“1000==1000”为false,而”100==100“为true?

    为什么 Java 中"1000 == 1000"为false,而"100 == 100"为true? 这是一个挺有意思的讨论话题 如果你运行下面的代码: Int ...

最新文章

  1. Varnish 和 Squid比较到底强多少
  2. 解决AndroidStudio2.0导入eclipse项目时卡死的问题
  3. 转:Android判断当前网络是否可用--示例代码
  4. linux 中使用 crontab 执行定时任务
  5. 技术干货 | Docker容器中需要避免的十种常见误区
  6. future promise shared_future简单使用
  7. Python自动化测试|如何解决前置模块及数据依赖(二)
  8. java递归mysql生成树_java递归生成树结构的数据
  9. js百度地图小车html,百度地图web开发(基于javascript)
  10. 课程作业记录10:63位PN码序列扩频通信Matlab仿真
  11. 大数据学习入门难,中科天玑给初学者支几招
  12. 下载离线 Visual Studio 离线安装包
  13. 【在线工具收集】抢票音视频剪辑照片PS代码在线编译打字练习游戏
  14. 求两个数最大公因数的c语言程序
  15. Google SketchUp Cookbook: (Chapter 2) Following Paths with Follow Me
  16. 放大缩小不习惯?只需两步教你solid works如何设置反转滚轮缩放
  17. 如何用看板工具做轻量级项目管理
  18. vscode工作级别认知与配置
  19. 《一周搞定模电》—功率放大器
  20. 近似值怎么用计算机,用计算器进行近似计算.docx

热门文章

  1. ***解决方案的选择
  2. 测试 远程端口 是否处于监听状态
  3. golang 指定范围 生成随机数
  4. 分析隐藏在比特币区块链中的Pony CC服务器
  5. linux id 命令 显示用户id和组id信息
  6. debian linux 版本代号
  7. Java回调函数的理解
  8. Linux 2.6 中的直接 I/O 技术
  9. Ubuntu安装google拼音输入法
  10. 新手建议学php吗,关于PHP新手学习的一些指导和建议,新手来我的