为什么Integer 100 == Integer 100而1000 != 1000?

如果运行如下代码

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

你会得到下面的结果

false
true

我们知道 == 比较的是引用指向的对象是否相同,内存地址是否一样。如果查看Integer的代码就会发现当你声明Integer a = 100;实际上,运行的是Integer a = 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之间,它就会返回该缓存的实例。至此就明白了以上问题。下面就是个很有趣的例子.

        Class cache = Integer.class.getDeclaredClasses()[0]; 
        Field myCache = cache.getDeclaredField("cache"); 
        myCache.setAccessible(true);

        Integer[] newCache = (Integer[]) myCache.get(cache); 
        newCache[132] = newCache[133]; 

        int a = 2;
        int b = a + a;
        System.out.printf("%d + %d = %d", a, a, b); 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • 怎么如此平静, 感觉像是走错了片场.为什么呢, 因为上下游工作在同一个线程呀骚年们! 这个时候上游每次调用emit...
    Young1657阅读 1,516评论 2 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 前言 看大神推荐的书单中入门有这么一本书,所以决定把这本书的精华(自认为很有用的点),或许是我自己现在能用到的点都...
    我没有三颗心脏阅读 2,291评论 0 6
  • 原来,我一直在被宠爱,可是他不说,所以我不知道。 我知道自己已经深深的爱上他,他亦爱我,我用了三年的时间看懂他,了...
    亚茹_我是阿茹阅读 131评论 0 0