黑马程序员技术交流社区

标题: 问题来了,关于Integer对象的自动拆装箱的问题,求高手解答~ [打印本页]

作者: 杨卓儒    时间: 2012-9-4 17:46
标题: 问题来了,关于Integer对象的自动拆装箱的问题,求高手解答~
本帖最后由 杨卓儒 于 2012-9-4 18:44 编辑
  1. public static void main(String[] args) {
  2.                 // TODO Auto-generated method stub
  3.                 //自动装箱
  4.                 Integer iObj =3;
  5.                 //自动拆箱
  6.                 System.out.println(iObj+12);
  7.                

  8.                
  9.                 Integer num1 = 12;
  10.                 Integer num2 = 12;
  11.                 System.out.println(num1==num2);//结果为 true
  12.                
  13.                 Integer num3 = 129;
  14.                 Integer num4 = 129;
  15.                 System.out.println(num3==num4);//结果为false
  16.                
  17.                 Integer num5 = Integer.valueOf(12);
  18.                 Integer num6 = Integer.valueOf(12);
  19.                 System.out.println("num5="+num5);
  20.                 System.out.println("num6="+num6);
  21.                 System.out.println(num6==num5);//true
  22.                
  23.                 Integer num7 = Integer.valueOf(213);
  24.                 System.out.println("num7="+num7);
  25.                 System.out.println(num7.toString());
  26.                 Integer num8 = Integer.valueOf(213);
  27.                 System.out.println("num8="+num8);
  28.                 System.out.println(num8.toString());
  29.                 System.out.println(num7==num8);//false
  30.                 System.out.println(num7.toString()==num8.toString());//false
  31.         }
复制代码
虽然知道,小于一个字节的Integer对象会应用享元模式,存储在常量池,但是我查了一下Integer对象,里面的valueOf是返回一个Integer对象,所以num7一定不等于num8
但是问题来了,Integer对象的toString 返回的是一个字符串啊,而且我打印了num7 和 num8返回的字符串都是213啊,为啥还是false



作者: 全海波    时间: 2012-9-4 17:52
本帖最后由 全海波 于 2012-9-4 17:55 编辑
  1. public static void main(String[] args) {

  2.                 // TODO Auto-generated method stub

  3.                 //自动装箱

  4.                 Integer iObj =3;

  5.                 //自动拆箱

  6.                 System.out.println(iObj+12);

  7.                



  8.                

  9.                 Integer num1 = 12;

  10.                 Integer num2 = 12;

  11.                 System.out.println(num1==num2);//结果为 true

  12.                

  13.                 Integer num3 = 129;

  14.                 Integer num4 = 129;

  15.                 System.out.println(num3==num4);//结果为false

  16.                

  17.                 Integer num5 = Integer.valueOf(12);

  18.                 Integer num6 = Integer.valueOf(12);

  19.                 System.out.println("num5="+num5);

  20.                 System.out.println("num6="+num6);

  21.                 System.out.println(num6==num5);//true

  22.                

  23.                 Integer num7 = Integer.valueOf(213);

  24.                 System.out.println("num7="+num7);

  25.                 System.out.println(num7.toString());

  26.                 Integer num8 = Integer.valueOf(213);

  27.                 System.out.println("num8="+num8);

  28.                 System.out.println(num8.toString());

  29.                 System.out.println(num7.equals(num8));//false
  30.                //很简单,把“==”改成“equals”就行了,想想“==”与“equals”的区别!
  31.                 System.out.println(num7.toString()== num8.toString());//false

  32.         }
复制代码
改之前,如下:

改之后,如下:

作者: 杨习平    时间: 2012-9-4 17:57
你既然说了Integer对象里面的valueOf是返回一个Integer对象,所以num7一定不等于num8,所以当你将它各自转化成字符串类型是他们还是两个对象。他们指向的地址值肯定是不一样的,虽然他们的对象值是一样的,但结果肯定还是false。
作者: 杨卓儒    时间: 2012-9-4 18:44
懂了,谢谢大家,我都忘了是String类型了,不能用==了啊,就上面我打印了一次NUM7和NUM8把我误导了。
作者: 舒远    时间: 2012-9-5 12:56
你把==理解成equals了。虽然值相等。但是==比较的是对象的内存地址。这两个对象内存地址显然不等。除基本类型外,比较值最好用equals方法。




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