黑马程序员技术交流社区

标题: ==比较问题 [打印本页]

作者: First    时间: 2013-5-26 01:10
标题: ==比较问题
本帖最后由 First 于 2013-5-26 19:19 编辑

  Integer i1 = new Integer(1);
  Integer i2 = new Integer(1);
  Integer i3 = Integer.valueOf(1);
  Integer i4 = Integer.valueOf(1);
  Integer i5 = 1;
  System.out.println("num1: "+ (i1==i2));
  System.out.println("num2: "+ (i3==i4));
  System.out.println("num3: "+ (1==i2));//---
  System.out.println("num4: "+ (1==i4));
  System.out.println("num5: "+ (i2==i4));//---
  System.out.println("num6: "+ (i5==i2));
  System.out.println("num7: "+ (i5==i4));
  System.out.println("num8: "+ (i5==1));

输出结果:

num1: false
num2: true
num3: true
num4: true
num5: false
num6: false
num7: true
num8: true
num1 是因为不同对象,
num2 是因为享元模式
num3 是什么原因?
num4 是什么原因?
num5呢? num3 和num4 成立 为何 num5 却false?
num6 是什么原因?num7是true,num6为何为false?
num7 是什么原因?

作者: JinnyZh    时间: 2013-5-26 01:56
1. 这个 System.out.println("num3: "+ (1==i2));
       System.out.println("num4: "+ (1==i4));
都是true是因为在jdk1.5之后, 基本数据类型的包装类和该基本数据类型比较的时候会自动拆箱为int型, 转为Integer类型,所以相等;
2.   Integer i2 = new Integer(1);  //i2的引用指向堆内存
      Integer i4 = Integer.valueOf(1); //i4的引用指向常量池
       所以为false
3. 关于Integer还有一个很重要的知识点,面试点
    Integer i1 = 127;
    Integer i2 = 127;
    System.out.println(i1 == i2);   //答案是true

    Integer i3 = 128;
    Integer i4 = 128;
    System.out.println(i3 == i4);   //答案是什么?哈哈楼主想一想,正确答案是false~

//////////////////////////////////////////////////////////////////////////////////////////
原因是:其实java在编译Integer i1 = 127的时候,被翻译成-> Integer i1 = Integer.valueOf(127);所以关键就是看valueOf()函数了。只要看看valueOf()函数的源码就会明白了。JDK源码的valueOf函数式这样的:


public static Integer valueOf(int i) {
         assert IntegerCache.high >= 127;
         if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
         return new Integer(i);
     }
//当Integer的值在-128 - 127之间时会进行缓存, 如果之前已经创建了一个127, 后创建的就会从缓存中取, 而不是new, 当不在这个范围内时, 就会重新创建new对象
.. 所以是false, 楼主明白了么

作者: Super_Class    时间: 2013-5-26 08:43
num3 是什么原因?   //这是因为进行比较时,使用了自动拆箱

num4 是什么原因? //理由同上

num5呢? num3 和num4 成立 为何 num5 却false?//new对象,就会在对内存中开辟空间,所以要记住的是只要new对象进行比较 “==” 一定是false

num6 是什么原因?num7是true,num6为何为false?   //这里要说一下的是,享元模式是针对装箱特有的
如果是 Integer i1 = 1;
        Integer i2 = 1;   这个才叫做享元模式

num7 是什么原因?//装箱操作也分为显式装箱和自动装箱操作

Integer i1 = 1;   //自动装箱
Integer i2 = Integer.valueOf(1);  //显式装箱   结果都是一样的
作者: First    时间: 2013-5-26 10:55
JinnyZh 发表于 2013-5-26 01:56
1. 这个 System.out.println("num3: "+ (1==i2));
       System.out.println("num4: "+ (1==i4));
都是tru ...

回答的好清晰,非常感谢
作者: First    时间: 2013-5-26 10:59
Super_Class 发表于 2013-5-26 08:43
num3 是什么原因?   //这是因为进行比较时,使用了自动拆箱

num4 是什么原因? //理由同上

扩展了我的知识面,
感谢
作者: HM张博文    时间: 2013-5-26 11:06
好复杂的问题哦,参考楼上的解答吧
作者: 王新年    时间: 2013-12-8 10:07
对于num3 和num4 成立是因为 当Integer的值在-128 - 127之间时会就会进行缓存使用的是同一份字节码,而num5使用的是自动装箱,所以他和mum3的字节码不同
作者: Kikyou2014    时间: 2014-11-8 01:10
好复杂的问题!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2