详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt346

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

如果你运行下面的代码

1
2
3
4
Integer a = 1000, b = 1000;  
    System.out.println(a == b);//1
    Integer c = 100, d = 100;  
    System.out.println(c == d);//2

你会得到

1
2
false
true

基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。

因此,后面一条语句也应该是false 。

这就是它有趣的地方了。如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。

所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似——

1
Integer c = 100;

的时候,它实际上在内部做的是

1
Integer i = Integer.valueOf(100);

现在,如果我们去看valueOf()方法,我们可以看到

1
2
3
4
5
public static Integer valueOf(int i) {
      if (i >= IntegerCache.low && i
          return IntegerCache.cache[i + (-IntegerCache.low)];
      return new Integer(i);
    }

如果值的范围在-128到127之间,它就从高速缓存返回实例。

所以…

1
Integer c = 100, d = 100;

指向了同一个对象。

这就是为什么我们写

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

我们可以得到true。

现在你可能会问,为什么这里需要缓存?

合乎逻辑的理由是,在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。

然而,通过反射API你会误用此功能。

运行下面的代码,享受它的魅力吧

1
2
3
4
5
6
7
8
9
10
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 两个Integer 中1000==1000为false而100==100为true?的更多相关文章

  1. jvm常量池 vsv为什么1000 == 1000返回为False,而100 == 100会返回为True?

    在jvm规范中,每个类型都有自己的常量池.常量池是某类型所用常量的一个有序集合,包括直接常量(基本类型,String)和对其他类型.字段.方法的符号引用.之所以是符号引用而不是像c语言那样,编译时直接 ...

  2. js中的0就是false,非0就是true及案例

    在处理js代码判断真假时经常会这么写. 但fun()可能得到的是数字0,这可不是表示的没有值,但是!js中的数字0就是false,非0就是true. 于是0就被无情的当做false了. 已经被这个坑过 ...

  3. js中的0就是false,非0就是true。

    在处理js代码判断真假时经常会这么写. var vale = fun();//从某个地方获取的值. if(!value){ 进入这里表示value为false或不存在 }但fun()可能得到的是数字0 ...

  4. 奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?

    如果你运行如下代码: 1 2 3 4 Integer a = 1000, b = 1000;  System.out.println(a == b);//1 Integer c = 100, d =  ...

  5. java 从List<Integer> 中随机获取6个数

    List<Integer> list 为不重复的数字集合,例如:1,2,3,4,5,6,7,8,9,10 从中随机获取不重复的6个数.代码如下. List<Integer> l ...

  6. java 判断Map集合中包含指定的键名,则返回true,否则返回false。

    public static void main(String[] args) { Map map = new HashMap(); //定义Map对象 map.put("apple" ...

  7. java中两个Integer类型的值相比较的问题

    今天在做一个算法时,由于为了和其他人保持接口的数据类型一致,就把之前的int换为Integer,前几天测了几组数据,和之前的结果一样,但是今天在测其它数据 的时候,突然出现了一个奇怪的bug,由于之前 ...

  8. Java int和Integer包装类的区别和比较

    区别:                                                                                                  ...

  9. 【Todo】Java学习笔记 100==100 & Reflection API & Optional类详解 & DIP、IoC、DI & token/cookie/session管理会话方式

    为什么1000 == 1000返回为False,而100 == 100会返回为True?   Link Java Reflection API:Link Java8 Optional 类深度解析: L ...

随机推荐

  1. tomcat 日志 按天自动分割 设定时任务定时清除

    一.日志分割所需jar包 1.下载tomcat   apache-tomcat-7.0.79.tar.gz 地址:http://www.apache.org/dist/tomcat/tomcat-7/ ...

  2. Android常用布局、文件存储与权限、XML

    常用的布局 LinearLayout Android 2.2开始fill_parent改名为match_parent ,从API Level为8开始我们可以直接用match_parent来代替fill ...

  3. NYOJ--46--最少乘法次数

    最少乘法次数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2 ...

  4. NYOJ--水池数目

    //NYOJ--水池数目 #include<iostream> #include<cstring> }; using namespace std; void dfs(int,i ...

  5. cvim常用快捷键

      esc:返回浏览模式 h.j.k.l:上.下.左.右 u/e.d:上半屏.下半屏 H.L:后退.前进 f.F:直接打开.后台打开 gg.G:页头.页尾 gi.gI:第一个输入框.最后一个输入框 q ...

  6. TensorFlow学习笔记1——安装

    1. 准备好Anaconda环境 具体参见:http://blog.csdn.net/zhdgk19871218/article/details/46502637 2. 建立名叫TensorFlow的 ...

  7. Jdbc模版式写法与Spring-JdbcTemplate的比较

    一.Jdbc模版式写法: [流程] 加载驱动 获取数据库链接 创建Statement对象(用于发送sql语句) 向数据库发送sql语句,获取数据库返回的结果集 从结果集中获取数据 释放资源 上述部分用 ...

  8. 详实的SQL学习笔记

    写在前面:最近在上海找工作,前前后后面试了N家单位,发现各个公司对程序员的数据库知识尤其是SQL语句的掌握程度有很高的要求,作为一名光荣的程序员,不会玩儿SQL语句走在街上根本不好意思和人打招呼!好了 ...

  9. 自写JS分页工具【基于JQ】

    好久没有来逛园子,也好久没有更新博客,就像沉睡已久的人忽然被叫醒,忽然就被园友的回复惊醒了.园友提出了关于我之前一篇文章的疑问--可那已经是半年以前的博客了,加上我一直觉得分享给大家的应该是我最新的思 ...

  10. MyEclipse 护眼配色

    因为长时间对着电脑,白底看着老累眼,所以想把myeclipse全部改成VS的黑主题,但最终无功而返.(读者有修改方案可以推荐给我哈,在此先谢谢了) 除了黑底的颜色主题,其实豆沙绿也是挺柔和的,下面是豆 ...