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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

上边那个new出来的对象会放到堆中,每new 一个就会在堆中开辟一个空间,引用数据类型==比较的是地址值,所以第一个==输出是false,equals比较的是内容输出true
第二个是方法是放到常量池中,integer ==比较地址值 equals 比较是内容
回复 使用道具 举报
基本类型==和equals比较的都是值,引用类型==比较的是地址,equals比较的是值
回复 使用道具 举报
==号是比较两个地址是否相同,而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



回复 使用道具 举报
第一个是new出来的,两个量的地址值是不一样的。第二个是直接指向同一个地址。不知道说对不对。
回复 使用道具 举报
第一种:i和j是分别开辟了两块内存地址来存储这两个值,所以 System.out.println(i==j);计算时为false(地址不同)
第二种:i1在内存空间开辟了一块地址存储3,存储j1时会先去已创建的对象里寻找是否有相同的值,有的话就使用地址,由于j1的值和i1的值是相同的,所以j1是直接引用i1的值,所以System.out.println(i1==j1);计算出来的值为true

“= =”比较两个变量本身的值,即两个对象在内存中的首地址。“equals()”比较字符串中所包含的内容是否相同
回复 使用道具 举报
tbh 中级黑马 2016-8-23 20:16:24
26#
                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
回复 使用道具 举报
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
回复 使用道具 举报
没分啊,哈哈哈
回复 使用道具 举报
本帖最后由 梦想的小草 于 2016-8-31 22:48 编辑

前面两个是new出来的值,存在于堆中,栈中的引用对象指向堆内存.后两个存在于方法区的常量池中,指向的是方法区,第一个比较的地址,输出false,第二个默认比较的也是地址,但是比较的如果是引用类型时,比较的是值,所有返回true;后两个都是指向的常量池的同一对象,所有地址和值都相等都是true;
如果不理解,你只要记得new出来的东西==都返回false,如果是引用类型equals则true,基本数据类型还是false;如果存在于常量池的东西,==与equals都是true;
回复 使用道具 举报
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

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

    ==比较的是2个对象的地址,而equals比较的是2个对象的内容。
回复 使用道具 举报
首先,==是比较地址值得,上面在堆中new了两个对象,所以地址值不同,而Integer是重写过equals()方法的,比较的是字面值,如果一模一样的就相等;下面的两个是跟常量池有关,常量池自带有个byte类型范围的整形,就是你赋值的数不超过
-128-127,在常量池都有,因为是常量,地址一致,所以相等;当你输入两个128的话,就会出现false
回复 使用道具 举报
integer里底层有一个cache缓存数组,-128到127之间的数据,你不用new的话,他是取的同一个地址,比较地址时是true,而用new的话会开辟新的堆内存地址空间,可以去看看底层自动拆箱装箱是如何完成的,研究一下常量池也会明白这样设计的原因,如果对这方面感兴趣,可以去研究一下《深入jvm虚拟机》,我也准备去看看,可以一起研究
回复 使用道具 举报
Integer a=new Integer(3);会创建个值为3的对象地址放在堆内存中
而int a=3,在栈内存中有个变量a只为3.
==号   基本类型比较值,引用类型比较地址
equals  字符串比较内容  引用型默认比较内容
回复 使用道具 举报
简单点说就是equals比较的是值是否相同,而==号呢,比较的是地址值. Integer i=new Integer(3);                 Integer j=new Integer(3);他们分别都new了一次,那就是他们的地址是不同的,所以(i==j) 是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.
回复 使用道具 举报
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.
回复 使用道具 举报
没看懂..........看来还要慢慢学习
回复 使用道具 举报
大爱黑马 希望每个人都有自己的成功
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马