为什么 Java 中"1000 == 1000"为false,而"100 == 100"为true? 这是一个挺有意思的讨论话题

如果你运行下面的代码:

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 && i

return 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]; //1

Field myCache = cache.getDeclaredField("cache"); //2

myCache.setAccessible(true);//3

Integer[] newCache = (Integer[]) myCache.get(cache); //4

newCache[132] = newCache[133]; //5

int a = 2;

int b = a + a;

System.out.printf("%d + %d = %d", a, a, b); //

}

java里false是什么意思_为什么 Java 中“1000==1000”为false,而”100==100“为true?相关推荐

  1. java里使用等号对象赋值_在Java中对象可以赋值, 只要使用赋值号(等号)即可, 相当于生成了一个各属性与赋值对象相同的新对象。...

    本可文件_文的副的_库中以存重要件中放在数据,中只值号值对中公文管理. 对自严格件要求较然条,对象等号当于不属物的下列于经济作是(,对象等号当于化生宜于专门集中进行产,物定经途的有某农作指具种特济用, ...

  2. java制作一个简单的画板_【Java】Thymeleaf一个简单示例

    Thymeleaf简单介绍 Thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎 Spring官方支持的服务的渲染模板中,并不包含jsp.而是Thymeleaf和Freemar ...

  3. java 必须try catch的异常_【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!...

    @ 1.异常 1.1 异常概念 异常 :简单说就是不正常运行,最终导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象.Java处 ...

  4. java web开源项目源码_适合Java新手的开源项目集合——在 GitHub 学编程

    作者:HelloGitHub-老荀 当今互联网份额最大的编程语言是哪一个?是 Java!这两年一直有听说 Java 要不行了.在走下坡路了.没错,Java 的确在走下坡路,未来的事情的确不好说,但是瘦 ...

  5. java 协程线程的区别_为什么 Java 坚持多线程不选择协程?

    谢邀. 先说结论:协程是非常值得学习的概念,它是多任务编程的未来.但是Java全力推进这个事情的动力并不大. 先返回到问题的本源.当我们希望引入协程,我们想解决什么问题.我想不外乎下面几点:节省资源, ...

  6. java线程池1001java线程池_深入浅出Java(Android )线程池ThreadPoolExecutor

    前言 关于线程池 在Java/Android开发中,设计到并发的请求,那基本上是离不开线程池了.用线程池的好处: 1.减少线程频繁创建.销毁的开销: 2.好控制并发量,降低OOM的可能,至于原因文中会 ...

  7. java gc回收堆还是栈_浅析JAVA的垃圾回收机制(GC)

    1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 注意:垃圾回 ...

  8. java两个字符串 相隔天数_关于Java: Joda-Time时间中两个日期之间的天数

    我如何找到两个joda time DateTime实例之间的天数差异?如果开始时间是星期一,结束时间是星期二,那么不管开始和结束日期的小时/分钟/秒是多少,返回值都应该是1. 如果从晚上开始到早上结束 ...

  9. java建立新文件保存数据_关于java中创建文件,并且写入内容

    packagecom.file.run;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;im ...

最新文章

  1. 北京大学北京天然气水合物国际研究中心招聘生信博后
  2. 经常造轮子的 AI 工程师水平通常不会太差
  3. 一个简单IOC与DI示例
  4. 学习Matlab强大的符号计算(解方程)
  5. Lock锁实现多线程卖票
  6. 记录pageHelper分页orderby的坑
  7. validatebox自定义验证规则以及使用
  8. Django 的第三方包
  9. prisma graphql 工具基本使用
  10. OSX Finder显示隐藏文件
  11. Q145: 三次曲线对比及其矩阵表示(Bezier, B-Spline, Hermite, Catmull-Rom)
  12. 统信UOS系统怎么下载QQ音乐
  13. linux 删除文件彻底删除文件夹,linux下彻底删除文件
  14. java 交易金额转换分,java金额元与分转换工具种
  15. 血浆/血清/尿液外泌体提取方案
  16. nginx服务器代理设置
  17. JS面向对象三大特性
  18. win2003 IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAd
  19. javaweb JAVA JSP 流浪狗管理系统(宠物狗管理系统)jsp小宠物在线管理网站源码
  20. flink java快速上手

热门文章

  1. 【STM32H7教程】第74章 STM32H7的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)
  2. java dwr 性能_DWR的工作原理和优缺点
  3. 电脑数据恢复软件怎么操作呢
  4. 第一个C语言编译器是怎样编写的
  5. 如何在C#项目中使用NHibernate
  6. sed 's 替换内容的\1是什么意思?
  7. 听书唾手可及,教你自己制作喜欢的有声小说
  8. 银河麒麟操作系统v10sp1安装eclipse
  9. 《技术顾问聘用协议书》个人分享
  10. 一开P2P终结者就断网