首页 > 编程语言 >为什么 Java 中“1000==1000”为false,而”100==100“为true?

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

时间:2023-10-12 11:25:28浏览次数:42  
标签:false cache System Integer 100 true 1000

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

如果你运行下面的代码:

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,cache,System,Integer,100,true,1000
From: https://www.cnblogs.com/hefeng2014/p/17759065.html

相关文章

  • 只有三行代码的神奇云函数的功能之三:100%成功获取unionid [纯转]
    微信小程序这是一个神奇的网站,哦不,神奇的云函数,它只有三行代码:(真的只有三行哦)云函数:loginindex.js:constcloud=require('wx-server-sdk')cloud.init()exports.main=async(event)=>{return{...event,...cloud.getWXContext()}} 神奇功能之三:100%成功获取unio......
  • json_encode return false
    json_encodereturnfalse怎么办if(!json_encode($result,JSON_PARTIAL_OUTPUT_ON_ERROR)){ var_dump(json_last_error());//打印上一次的错误代码:int(5) //所有字符串数据的编码必须是UTF-8。 //mb_convert_encoding($str,"UTF-16");//把字符串转为utf-16编码 echo......
  • ERROR in node_modules/rxjs/dist/types/internal/operators/combineLatest.d.ts(3,61
    原文链接:https://www.longkui.site/error/error-in-node_modules-rxjs/4839/angular项目,启动的时候报错。详细的报错如下:这个报错的原因比较简单,rxjs的版本不对,我用的是angular7可能和rxjs版本不匹配。解法方法也很简单,主要是降版本,我们找到项目的package.json把rxjs版本改成......
  • 2023-10-11:用go语言,一个数字n,一定要分成k份, 得到的乘积尽量大是多少? 数字n和k,可能非常
    2023-10-11:用go语言,一个数字n,一定要分成k份,得到的乘积尽量大是多少?数字n和k,可能非常大,到达10^12规模。结果可能更大,所以返回结果对1000000007取模。来自华为。来自左程云。答案2023-10-11:大体过程如下:算法1:暴力递归1.首先判断k是否为0或者n是否小于k,若是则返回-1。2.调用递归函数pr......
  • 2023-10-11:用go语言,一个数字n,一定要分成k份, 得到的乘积尽量大是多少? 数字n和k,可能非常
    2023-10-11:用go语言,一个数字n,一定要分成k份,得到的乘积尽量大是多少?数字n和k,可能非常大,到达10^12规模。结果可能更大,所以返回结果对1000000007取模。来自华为。来自左程云。答案2023-10-11:大体过程如下:算法1:暴力递归1.首先判断k是否为0或者n是否小于k,若是则返回-1。2.调......
  • 父元素flex:1 子元素height:100%
    <style>.box{display:flex;flex-direction:column;overflow:hidden;//只要不是auto}.parent{flex:1;min-height:0;//orheight:0}.children{......
  • 冲刺只能跑100米 漫步却能走一万步或一万米
    飘风不终朝 骤雨不终日。意思就是说,狂风不会刮一个早晨,暴雨也不会下一整天。真正能够长久下去的,是梅雨季节的绵绵细雨。努力,不应该是一种时刻需要提醒自己去做的事情,而是一种早已嵌入生活中的习惯。短暂地刻意奔跑,只会迅速消耗完你的精神能量,然后让你迅速变得萎靡不振。相信......
  • 231009校内赛
    T1里群题解阴间第一题题目中有一个很明显的建图方法就是对于第\(i\)天入群的人在第\(j\)天退群那么就在\(i,j\)之间连一条边首先有一个结论,管理员个数不大于\(3\)对于这个结论,证明如下:首先第一次删除出现后就一定需要两个管理员了如果某次删除只删掉了某一个管理......
  • LY1376 [ 20231008 NOIP 模拟赛 T0 ] 递增路径
    题意\(A\),\(B\)两人轮流在一张图上移动一个点。要求这次移动的边权必须大于上次的。\(A\)希望游戏进行的轮数多,\(B\)希望游戏进行的轮数少。对于每个\(s=1,2,...,n\)作为起点,若双方都采用最优策略,游戏会进行多少轮。Sol考虑将所有边按照从大到小的顺序排序。每......
  • winget 0x8051100f错误
    解决WinGet0x8051100f错误接手了公司旧的电脑,安装的是精简版的Windows10系统,今天在准备使用winget的时候发现并没有安装。然而这台电脑精简的有点过分了,连MicrosoftStore都没有,装好WinGet之后发现执行的时候居然还会报错0x8a15000f错误。解决方案遇到错误0x8a15000f时,按照以......