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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© flydream 中级黑马   /  2016-8-6 22:43  /  10331 人查看  /  41 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
               Integer i=new Integer(3);
                Integer j=new Integer(3);
                System.out.println(i==j);
                System.out.println(i.equals(j));
               
                Integer i1=3;
                Integer j1=3;
                System.out.println(i1==j1);
                System.out.println(i1.equals(j1));
这又啥区别啊,真实醉了,

41 个回复

正序浏览
一个在堆内存一个在常量池
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
一个引用和另外一个常量
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
大爱黑马 希望每个人都有自己的成功
回复 使用道具 举报
没看懂..........看来还要慢慢学习
回复 使用道具 举报
Integer类是int行数据的包装类, Integer i=new Integer(3);  和 Integer j=new Integer(3);是创建了两个Integer对象,当用"=="符比较两个对象时,比较的是地址,地址相同返回true;而Integer继承Object类并重写了equals方法,只要两个对象的int值相等就返回true.另外,Java中存在字节常量池,   Integer i1=3;   Integer j1=3;这两个地址相同,因为3在-128到127之间,当在这个范围给Integer对象赋值时,不会重新创建对象,例如Integer  a = 188;  Integer  b = 188;这两个就是两个不同的对象,如果用"=="比较,则返回false,而equals方法只要值相等就返回true.
回复 使用道具 举报
Integer类是int行数据的包装类, Integer i=new Integer(3);  和 Integer j=new Integer(3);是创建了两个Integer对象,当用"=="符比较两个对象时,比较的是地址,地址相同返回true;而Integer继承Object类并重写了equals方法,只要两个对象的int值相等就返回true.另外,Java中存在字节常量池,   Integer i1=3;   Integer j1=3;这两个地址相同,因为3在-128到127之间,当在这个范围给Integer对象赋值时,不会重新创建对象,例如Integer  a = 188;  Integer  b = 188;这两个就是两个不同的对象,如果用"=="比较,则返回false,而equals方法只要值相等就返回true.
回复 使用道具 举报
Integer类是int行数据的包装类, Integer i=new Integer(3);  和 Integer j=new Integer(3);是创建了两个Integer对象,当用"=="符比较两个对象时,比较的是地址,地址相同返回true;而Integer继承Object类并重写了equals方法,只要两个对象的int值相等就返回true.另外,Java中存在字节常量池,   Integer i1=3;   Integer j1=3;这两个地址相同,因为3在-128到127之间,当在这个范围给Integer对象赋值时,不会重新创建对象,例如Integer  a = 188;  Integer  b = 188;这两个就是两个不同的对象,如果用"=="比较,则返回false,而equals方法只要值相等就返回true.
回复 使用道具 举报
一楼说的很简洁
回复 使用道具 举报
简单点说就是equals比较的是值是否相同,而==号呢,比较的是地址值. Integer i=new Integer(3);                 Integer j=new Integer(3);他们分别都new了一次,那就是他们的地址是不同的,所以(i==j) 是false.而.equals比较的是值,那不用看就知道是true.
回复 使用道具 举报
Integer a=new Integer(3);会创建个值为3的对象地址放在堆内存中
而int a=3,在栈内存中有个变量a只为3.
==号   基本类型比较值,引用类型比较地址
equals  字符串比较内容  引用型默认比较内容
回复 使用道具 举报
integer里底层有一个cache缓存数组,-128到127之间的数据,你不用new的话,他是取的同一个地址,比较地址时是true,而用new的话会开辟新的堆内存地址空间,可以去看看底层自动拆箱装箱是如何完成的,研究一下常量池也会明白这样设计的原因,如果对这方面感兴趣,可以去研究一下《深入jvm虚拟机》,我也准备去看看,可以一起研究
回复 使用道具 举报
首先,==是比较地址值得,上面在堆中new了两个对象,所以地址值不同,而Integer是重写过equals()方法的,比较的是字面值,如果一模一样的就相等;下面的两个是跟常量池有关,常量池自带有个byte类型范围的整形,就是你赋值的数不超过
-128-127,在常量池都有,因为是常量,地址一致,所以相等;当你输入两个128的话,就会出现false
回复 使用道具 举报
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

    equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

    ==比较的是2个对象的地址,而equals比较的是2个对象的内容。
回复 使用道具 举报
本帖最后由 梦想的小草 于 2016-8-31 22:48 编辑

前面两个是new出来的值,存在于堆中,栈中的引用对象指向堆内存.后两个存在于方法区的常量池中,指向的是方法区,第一个比较的地址,输出false,第二个默认比较的也是地址,但是比较的如果是引用类型时,比较的是值,所有返回true;后两个都是指向的常量池的同一对象,所有地址和值都相等都是true;
如果不理解,你只要记得new出来的东西==都返回false,如果是引用类型equals则true,基本数据类型还是false;如果存在于常量池的东西,==与equals都是true;
回复 使用道具 举报
没分啊,哈哈哈
回复 使用道具 举报
Integer i=new Integer(3);        //在堆内存中创建一个对象1,然后将该对象的地址赋值给i
            Integer j=new Integer(3);        //在堆内存中创建一个对象2,注意和上一个对象不是一个,然后将该对象的地址赋值给j
            System.out.println(i==j);        //i中存储的是对象1的地址,j中存储的是对象2的地址,== 是比较两个对象的地址,所有输出是false
            System.out.println(i.equals(j));        //.equals()比较的是对象中的内容,所以结果是true
               
            Integer i1=3;        //在方法区中的常量区为“3”分配一个空间,将该空间的地址赋值给i1
            Integer j1=3;        //程序发现常量区中有“3”,所以就直接将“3”的内存地址赋值给j1
            System.out.println(i1==j1);        //==比较的是地址,所以结果是true
            System.out.println(i1.equals(j1));        //.equals()比较的是内容,所以结果还是是true
回复 使用道具 举报
tbh 中级黑马 2016-8-23 20:16:24
25#
                Integer i=new Integer(3);   //这句话在堆内存中创建了一个空间,并存储了 3
                Integer j=new Integer(3);  //同上
                System.out.println(i==j);   // == 号直接判断地址值,因为是开辟了两个空间,所以两个地址值不同,返回false
                System.out.println(i.equals(j));  //  equals 判断值,所以返回true
               
                Integer i1=3;         // 在这个语句执行的时候,会先判断常量池中有没有这个数字,有的话会记录常量池中的地址,没有的话会放到常量池中并记录地                                               //址值
                Integer j1=3;         //  同上
                System.out.println(i1==j1);    // == 判断地址值,由于两个变量中存储的是常量池中的同一个地址,所以返回true
                System.out.println(i1.equals(j1));  // equals 判断内容,两个值相等,所以返回 true
回复 使用道具 举报
第一种:i和j是分别开辟了两块内存地址来存储这两个值,所以 System.out.println(i==j);计算时为false(地址不同)
第二种:i1在内存空间开辟了一块地址存储3,存储j1时会先去已创建的对象里寻找是否有相同的值,有的话就使用地址,由于j1的值和i1的值是相同的,所以j1是直接引用i1的值,所以System.out.println(i1==j1);计算出来的值为true

“= =”比较两个变量本身的值,即两个对象在内存中的首地址。“equals()”比较字符串中所包含的内容是否相同
回复 使用道具 举报
第一个是new出来的,两个量的地址值是不一样的。第二个是直接指向同一个地址。不知道说对不对。
回复 使用道具 举报
==号是比较两个地址是否相同,而equal是用来比较数值是否相等的。
Integer i=new Integer(3);     
Integer j=new Integer(3);        //这等于在堆内存中创建了两个对象,所有地址是不同的,而内容是一样的
System.out.println(i==j);          //结果为false
System.out.println(i.equals(j));     //结果为true

Integer i1=3;
Integer j1=3;        //地址相同,内容也相同
System.out.println(i1==j1);       //结果为true
System.out.println(i1.equals(j1));   //结果为true



回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马