黑马程序员技术交流社区

标题: 帮我分析一下代码及打印结果 [打印本页]

作者: 759345779    时间: 2014-4-3 12:46
标题: 帮我分析一下代码及打印结果
  1. public class Demo {
  2.         public static void main(String args[]) {
  3.                
  4.                 Integer x = 128;
  5.                 Integer y =128;
  6.                 System.out.println(x==y);
  7.                 System.out.println(y.equals(x));
  8.                 //*******************************
  9.                 int x1 = 128;
  10.                 Integer y1 =128;
  11.                 System.out.println(x1==y1);
  12.                 System.out.println(y1.equals(x1));
  13.         }
  14. }
复制代码


为什么打印结果是
false
true
true
true
而不是
true
true
true
true
作者: 肖涵    时间: 2014-4-3 13:02
Integer是int包装类,注意是一个类。第一个比较x==y是两个对象进行比较,结果为faulse,创建对象所赋值存储在常量区,第二个输出语句为true。equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等,区分大小写。
int x1 = 128;
Integer y1 =128;
System.out.println(x1==y1);
在这个比较当中Interger会自动拆箱成int类型,输出结果为ture。

作者: Engle    时间: 2014-4-3 13:13
Integer x = 128;
Integer y =128;
System.out.println(x==y);
打印是false的原因是因为你的值是128,
没有什么神秘的,你只要看看源码就明白了:)
平常我们使用Integer a = xxx;的时候,
Integer类实际上是调用的是public static Integer valueOf(int i)方法。这个方法在源码中是这样的:
public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }
当你值范围不在-128和127之间的时候,就会在内存里开辟新的一块空间。
而==比较的就是内存空间的地址,肯定就不相同了

作者: 759345779    时间: 2014-4-3 13:16
肖涵 发表于 2014-4-3 13:02
Integer是int包装类,注意是一个类。第一个比较x==y是两个对象进行比较,结果为faulse,创建对象所赋值存储 ...

谢谢解答
作者: 759345779    时间: 2014-4-3 13:17
Engle 发表于 2014-4-3 13:13
Integer x = 128;
Integer y =128;
System.out.println(x==y);

谢谢你的解答
作者: 请备注    时间: 2014-4-3 14:13
数值在-128~127以内 ,第一个打印出的就是ture了
作者: _Water    时间: 2014-4-3 15:13
本帖最后由 _Water 于 2014-4-3 15:16 编辑

java在编译Integer x = 128的时候,被翻译成-> Integer x = Integer.valueOf(128);
所以关键就是看valueOf()函数了.

对于-128到127之间的数,会进行缓存,Integer a = 127时,会将127进行缓存,
下次再写Integer b = 127时,就会直接从缓存中取,就不会new了。
所以9行的结果为true,而7行为false。
作者: z1342802487    时间: 2014-4-3 21:48
Integer 是int的封装对象,java为了提高效率,初始化了-128--127之间的整数对象,所以在赋值在这个范围内都是同一个对象。你写的不在这一范围内,所以两个不同的对象,它们的地址自然就不同,所以x==y为false。如果你写-128-127之间的值,x==y就为true.
public class test {
        public static void main(String args[]) {
                Integer x = 128;
                Integer y =128;
                System.out.println(x==y);
                System.out.println(y.equals(x));
                Integer a = 127;
                Integer b = 127;
                System.out.println("a==b  "+(a==b));
        }}
equals 方法就不多说了,大家都知道。equals只针对对象的内容,不关心地址。
Integer与int比较,int是基本类型,比较的的值。
作者: muma    时间: 2014-4-4 09:22
  1. public class Demo {

  2.         public static void main(String args[]) {

  3.                
  4.                 Integer x = 128;

  5.                 Integer y =128;

  6.                 System.out.println(x==y);//x==y是两个对象进行比较,结果为faulse,创建对象所赋值存储在常量区

  7.                 System.out.println(y.equals(x));//equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等,区分大小写。

  8.                 //*******************************

  9.                 int x1 = 128;

  10.                 Integer y1 =128;

  11.                 System.out.println(x1==y1);//在这个比较当中Interger会自动拆箱成int类型,输出结果为ture。

  12.                 System.out.println(y1.equals(x1));//同第二个

  13.         }

  14. }
复制代码

作者: 心?=忐§忑]    时间: 2014-4-5 14:24
应为上面的x和y使用的是Integer定义的,用 == 比较的是栈中的对象地址,所以是false.而下面的一个x1是int型的,比较是y自动先下转型成int型了。




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