A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 759345779 中级黑马   /  2014-4-3 12:46  /  1133 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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

9 个回复

倒序浏览
Integer是int包装类,注意是一个类。第一个比较x==y是两个对象进行比较,结果为faulse,创建对象所赋值存储在常量区,第二个输出语句为true。equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等,区分大小写。
int x1 = 128;
Integer y1 =128;
System.out.println(x1==y1);
在这个比较当中Interger会自动拆箱成int类型,输出结果为ture。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
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之间的时候,就会在内存里开辟新的一块空间。
而==比较的就是内存空间的地址,肯定就不相同了

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
肖涵 发表于 2014-4-3 13:02
Integer是int包装类,注意是一个类。第一个比较x==y是两个对象进行比较,结果为faulse,创建对象所赋值存储 ...

谢谢解答
回复 使用道具 举报
Engle 发表于 2014-4-3 13:13
Integer x = 128;
Integer y =128;
System.out.println(x==y);

谢谢你的解答
回复 使用道具 举报
数值在-128~127以内 ,第一个打印出的就是ture了
回复 使用道具 举报
本帖最后由 _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。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
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是基本类型,比较的的值。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
muma 中级黑马 2014-4-4 09:22:57
9#
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
应为上面的x和y使用的是Integer定义的,用 == 比较的是栈中的对象地址,所以是false.而下面的一个x1是int型的,比较是y自动先下转型成int型了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马