黑马程序员技术交流社区

标题: 请问 i 和 j 为什么不相等? [打印本页]

作者: 我能学编程吗    时间: 2013-10-29 19:14
标题: 请问 i 和 j 为什么不相等?
本帖最后由 我能学编程吗 于 2013-10-30 14:02 编辑
  1. Integer i = new Integer(1);
  2. Integer j = i;
  3. i = i + 1;
  4. System.out.println(i == j); // false
复制代码

作者: 雨过丶天已晴    时间: 2013-10-29 19:43
先说一说这个代码的第三步运算过程:
  i = i + 1;
  对象i先拆箱,变成int型与1相加,然后又自动装箱转化成Integer对象
再说一说第四句代码的运算:
   System.out.println(i == j);
由于i 与 j均在–128到127之间,所以Integer对象会重用,也就是当i 与 j的值相等的时候,两个对象就相等
但是这里 i  = 2与 j = 1, i , j的值不相等,所以会输出false。

作者: 零下五度的水    时间: 2013-10-29 19:49
帮助文档原话:"The Class instance representing the primitive type int."
Integer实例本身还是个int
作者: 靓仔    时间: 2013-10-29 19:58
给你个例子,希望你能懂。首先声明你的i=2;j=1,所以肯定为false。如果i和j值指向了同一个对象,就为ture。
/*
JDk版本以后出现的心特性
*/
class IntegerDemo1
{
        public static void main(String[] args)
        {
                //Integer x=new Integer(4)
                Integer x=4;//自动装箱。new Integer(4);
                x = x+2;//4是一个对象,直接加int 2,x+2进行自动拆箱。变成了int类型,和2进行加法运算
                                //再将和进行装箱赋给x;
                Integer m=128;
                Integer n=128;
                System.out.println(m==n);//false
                Integer a=127;//
                Integer b=127;
                System.out.println(a==b);//true 因为a和b指向了同一个Integer对象
                                                                //因为当数值在byte范围内容(-128-127之间),对于新特性,如果该数值已经存在,则不会再开辟新的空间。
                //System.out.println("Hello World!");
        }
}
作者: 我能学编程吗    时间: 2013-10-29 20:11
谢谢楼上各层的回答,我明白了,
i = i + 1; 中:
先是拆包进行相加: i.intValue() + 1,值为2
后再装包赋值给i : i = new Integer(2);

所以合起来,i = i + 1 相当于:
i = new Integer(i.intValue() + 1);
从这里可知,我们改变的并不是i里面int的值,而是把变量i指向了一个新的Integer对象
作者: 黄炳期    时间: 2013-10-29 20:21
明白了的话可以重新编辑帖子,修改主题为“提问结束”
作者: To    时间: 2013-10-30 00:10
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




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