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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 微凉的暮色   /  2015-6-11 23:51  /  14683 人查看  /  72 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学习了!
回复 使用道具 举报
== 如果想返回true 的话,两个比较者必须是同一个对象。如果比较者之间没有任何继承关系的话,就不会通过编译。其他我就不知道了
回复 使用道具 举报
我所值的 必须是同一个对象 是说  == 符号两边的引用必须指向堆内存中同一对象 或者说是地址。  楼主可以自定义一个类,声明3个实例,比如  person  a,b,c  。然后将a = new person(15) b= new person(15)  然后 将 a赋给c   即  c = a  然后  打印  a==b  a==c  的值  应该一个是false  一个是 true
在打印 a  b  c  (System.out.println(a);System.out.println(b);System.out.println(c);)a 和c  应该是一样
这就证明了  ==   在比较 引用类型时只是比较 引用的地址时候相同,就和 比较两个整数值是一样的。  

声明:这是我认为的,不是官方啊。如果不对,恢复我一下哈
回复 使用道具 举报
本帖最后由 15383016390 于 2015-6-18 23:16 编辑

1、对于基本数据类型“==”和equals都是比较值。2、对于引用对象,都是比较两者在栈内存中地址是否相同。
3、对于 String类型equals 比较的是 具体内容,==比较的是内存地址。
public class StringDemo{
       public static void main(String[] args){
            String s1 = "abc";
            String s2 = "abc";
            System.out.println(s1 == s2);
      }
}
运行结果是true,因为 字符串创建的时候,有一个字符串常量池,s1创建后,"abc"放入其中。s2创建的时候,"abc"已经存在于字符串常量池中,故引用变量s2直接指向了已经存在的"abc"字符串对象,故s1==s2。
public class StringDemo{
       public static void main(String[] args){
            String s1 = "abc";
            String s2 = new String("abc" );
            System.out.println(s1 == s2);
      }
}
这段代码运行结果是false,因为s1创建后,是在字符串常量池中创建了一个"abc"字符串对象。而s2是在堆内存中创建了另外一个"abc"字符串对象。两者在栈内存中的地址是不一样的。
把上面两例中的“==”都用equals替换,输出结果都是true。


回复 使用道具 举报
最浅显的就是==比较的是基本数据类型的值,equals比较的是引用数据类型的内容,equals是Object类中的一个方法,具体到每个类中的话是需要重写这个方法才能实现我们想要的结果。如果不重写该方法,默认比较的是引用数据的地址值。
回复 使用道具 举报
看看源码就明白怎么回事了,==底层比较的是内存地址,也就是哈希值。equals,对于Object来说,equals调用的还是==,但是如果是其它类,如String等,会复写Object类equals方法,从而比较只是字符串的内容。不同类的equals方法功能内容可能都有可能不一致。
回复 使用道具 举报
楼上已有人回答,equls是比较内容,==是比较内存地址
回复 使用道具 举报
JRT 中级黑马 2015-6-19 19:45:04
48#
不就是地址值吗,不过String类重写了Object类中的equals()而已
回复 使用道具 举报
JRT 中级黑马 2015-6-19 19:46:50
49#
wx_d9b6mRbI 发表于 2015-6-12 13:33
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们 ...

受教,女中豪杰哦
回复 使用道具 举报
Diors 中级黑马 2015-6-19 20:39:03
50#
你的这个例子里,三个字符串都是用new String初始化的,所以地址都不一样,用==比较结果都是false。但是内容一样,都是XYZ,用equals比较都是true。==比较地址,equals比较内容看具体的类中equals是怎么写的。
回复 使用道具 举报
kalon 来自手机 中级黑马 2015-6-20 11:41:29
51#
对于字符串变量来说,==比较的是值,而equals比较的是其内容
回复 使用道具 举报
当new了对象之后,对象放在了堆中,而内容放在了栈里边,== 是先比较堆的地址,如果地址对,在比较栈中的内容。equals是比较栈中的内容。   
回复 使用道具 举报
本帖最后由 bowen-xiao 于 2015-6-21 08:54 编辑
wx_d9b6mRbI 发表于 2015-6-12 13:33
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们 ...
  1. String s1 = new String("123");
  2.                 String s2 = new String("123");
  3.                
  4.                 System.out.println(s1 == s2);//
复制代码


猜猜什么结果
回复 使用道具 举报
       值类型是存储在内存中的栈,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
       ==操作比较的是两个变量的值是否相等,
       对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。        
        equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
        ==比较的是2个对象的地址,而equals比较的是2个对象的内容。显然,当equals为true时,==不一定为true。
         

回复 使用道具 举报
       值类型是存储在内存中的栈,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同 。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。==比较的是2个对象的地址,而equals比较的是2个对象的内容。显然,当equals为true时,==不一定为true。
         

回复 使用道具 举报
最精确的说:“==”比较的是变量值,“equals()”比较的是对象内容。阐述一下,8个基本类型,用==比较不必说,就是比较变量值;对象引用类型,比较时也是比较的引用变量值,何为引用变量呢,这就是实现机制问题了,引用本身也是一个变量,其值就是该对象的存储地址。而equals(),比较的是变量实际表示的值,那么基本类型不必说,对象引用类型实际表示的值是对象内部成员的值,而不是引用变量的值。区别就在这,二者有交叉,有区别。
回复 使用道具 举报
实际上,“==”,从实现原理上来说,这个比较是计算机认为的相等,而equals()比较的是人认为的相等。
回复 使用道具 举报
==:是比较它们的内存空间是不是相同的,而

equals:是比较它们的值
回复 使用道具 举报
楼主说的这个问题我重点研究过 ==比较的是值是否相等,如果比较的是基本类型,那么就会比较这两个值,比如3==2,返回值是false  如果比较的是引用类型,比如两个学生对象,那么比较的是地址值,这个地址值就是栈内存变量指向堆内存空间的地址值,你可以造一个没有重写toString()方法的对象,用println输出一下对象名来看一下这个地址值。。
equal()是一个方法,它存在于Object这个类中,又因为这个类是所有类的父类,所以所有对象都可以调用这个方法,而且这个方法的参数接受的也是任意类型对象  这个方法在Object中,代码大致是return this==obj,就是默认返回的结果是比较这两个对象的地址值是否相同,如果你想要让这个方法比较的是对象的内容是否相同(比如一个学生类  比较姓名 年龄等等),那你自己就需要重写,根据你的需求来重写具体要比较什么,然后设置返回值是true还是false。。至于怎么重写,你可以用eclipse自动生成开看一下 或者你可以通过API查看String这个类,然后看看它里面的equal方法。。这个方法就是重写后的(java工作人员,封装这个类的时候 重写的)  还有一个需要注意的地方,ArrayList集合中的contains这个方法,底层依赖的是equal方法,如果你集合中的对象中 没有重写equal方法,那么比较是否包含的结果永远都会返回fslse。哥们,纯手打,希望给点分  如果还有不懂的可以加我扣扣  363246266
回复 使用道具 举报
我学了半个月的理解就是  ==是用于基本类型的比较 而equals比较的是 引用类型里面的内容。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马