为什么 Java 中 1000==1000 为 false ?
点击上方蓝色“程序猿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 ?相关推荐
- java中从1000万个随机数中查找出相同的10万个随机数花的最少时间
偶然在群里看到有人问到大数据查询,自己也就想了小艾改如何解决,从从1000万个随机数中查找出相同的10万个随机数花的最少时间, 谈到效率,自然是hashmap莫属. import java.util. ...
- java中生成1000~10000之间的随机数
要生成在[min,max]之间的随机整数,可使用Random类进行相关运算: Random random = new Random(); int s = random.nextInt(max)%(ma ...
- java中怎么定义true或false_java 中的true、false、null有何不同
java 中的true.false.null有何不同 发布时间:2020-11-10 15:47:53 来源:亿速云 阅读:92 作者:Leah 这篇文章将为大家详细讲解有关java 中的true.f ...
- java中后退键_java - 单击后退按钮两次以退出活动
java - 单击后退按钮两次以退出活动 我最近在很多Android应用和游戏中都注意到了这种模式:当点击后退按钮"退出"应用程序时,Toast会出现类似于"请再次单击B ...
- 为什么 Java 中“1000==1000”为false,而”100==100“为true?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来自: 码农网 译文链接:http://www.codeceo.c ...
- 漫话:如何给女朋友解释为什么 Java 中1000==1000为 false,而100==100为 true?
作者 | 漫话编程 来源 | 漫话编程(ID:mhcoding) public static void main(String[] args) {Integer integer1 = 100; Int ...
- java cache缓存_涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?
为什么 Java 中"1000==1000"为false,而"100==100"为true? 这是一个挺有意思的讨论话题. 如果你运行下面的代码: Integ ...
- java cache缓存_为什么 Java 中“1000==1000”为false,而”100==100“为true?
阅读本文大概需要 2 分钟. 来自: 码农网 为什么 Java 中"1000==1000"为false,而"100==100"为true? 这是一个挺有意思的讨 ...
- 为什么Java 中1000==1000为false,而100==100为true?
本文转载自微信公众号:漫话编程,这是一个通过漫话的形式讲解枯燥的技术知识的公众号,点击下方链接可直接关注. public static void main(String[] args) {Intege ...
- java里false是什么意思_为什么 Java 中“1000==1000”为false,而”100==100“为true?
为什么 Java 中"1000 == 1000"为false,而"100 == 100"为true? 这是一个挺有意思的讨论话题 如果你运行下面的代码: Int ...
最新文章
- Varnish 和 Squid比较到底强多少
- 解决AndroidStudio2.0导入eclipse项目时卡死的问题
- 转:Android判断当前网络是否可用--示例代码
- linux 中使用 crontab 执行定时任务
- 技术干货 | Docker容器中需要避免的十种常见误区
- future promise shared_future简单使用
- Python自动化测试|如何解决前置模块及数据依赖(二)
- java递归mysql生成树_java递归生成树结构的数据
- js百度地图小车html,百度地图web开发(基于javascript)
- 课程作业记录10:63位PN码序列扩频通信Matlab仿真
- 大数据学习入门难,中科天玑给初学者支几招
- 下载离线 Visual Studio 离线安装包
- 【在线工具收集】抢票音视频剪辑照片PS代码在线编译打字练习游戏
- 求两个数最大公因数的c语言程序
- Google SketchUp Cookbook: (Chapter 2) Following Paths with Follow Me
- 放大缩小不习惯?只需两步教你solid works如何设置反转滚轮缩放
- 如何用看板工具做轻量级项目管理
- vscode工作级别认知与配置
- 《一周搞定模电》—功率放大器
- 近似值怎么用计算机,用计算器进行近似计算.docx