专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
OSC开源社区  ·  2024前端现状:开发者最爱用React、最 ... ·  3 天前  
Java知音  ·  真的建议赶紧搞个软考证书!(红利期) ·  6 天前  
程序员的那些事  ·  太荒谬了!千人公司一刀切禁用 ... ·  1 周前  
程序猿  ·  Go 即将冲击 JavaScript ... ·  1 周前  
51好读  ›  专栏  ›  程序员大咖

为什么1000 == 1000返回为False,而100 == 100会返回为True?

程序员大咖  · 公众号  · 程序员  · 2017-05-09 19:11

正文

点击上方蓝色字体关注「程序员大咖」


来源:回忆和感动

链接:evget.com/article/2015/11/19/23028.html


这是我们今天要讨论的话题,因为我觉得它非常的有趣。


如果你运行如下代码:


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;


两者指向同样的对象。


这就是为什么这段代码的结果为true了:


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


现在你可能会问,为什么会为-128到127之间的所有整数设置缓存?


这是因为在这个范围内的小数值整数在日常生活中的使用频率要比其它的大得多,多次使用相同的底层对象这一特性可以通过该设置进行有效的内存优化。你可以使用reflection 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开发者必备微信号 


Java编程精选
微信号:JavaPush



推荐理由:
关注语言编程Java,分享、交流Java编程技巧和信息


 ▼长按下方↓↓↓二维码识别关注