黑马程序员技术交流社区

标题: "=="和equals方法究竟有什么区别? [打印本页]

作者: wang90ling    时间: 2014-11-5 22:41
标题: "=="和equals方法究竟有什么区别?
"=="和equals方法究竟有什么区别?
作者: 奋斗的蜗牛ksd    时间: 2014-11-5 23:12
有明显的区别哦  ==用于引用对象的时候比如  数组 和对象,比较的两者的地址
equals()方法,比较的是两者的值 是否相等

比较基本数据类型的话,就一样的咯!
作者: hailong    时间: 2014-11-5 23:32
==是比较运算符,比较基本数据类型,比较具体数值是否相等,==两边是引用数据类型时,比较的是两个对象的内存真实地址
equals是 Object中的一个方法,是比较对象的,默认情况下比较的是两个对象的真实地址,可以覆盖equals方法,建议对象自己的比较形式
作者: 田峻菘    时间: 2014-11-5 23:40
楼上正解,我们老师说的:)
作者: hailong    时间: 2014-11-5 23:41
田峻菘 发表于 2014-11-5 23:40
楼上正解,我们老师说的

峻菘同学技术分不少了呀!!:lol
作者: Processor    时间: 2014-11-5 23:59
田峻菘 发表于 2014-11-5 23:40
楼上正解,我们老师说的

居然看到同班同学了{:3_46:}
作者: jacoblx    时间: 2014-11-6 04:41
本帖最后由 jacoblx 于 2014-11-6 04:43 编辑

我再总结一下


基本数据类型
引用数据类型
作用
==
数值是否相等
对象地址是否相等
一般用于基本数据类型的比较
equals方法
不可用
没有覆写equals方法的情况下:
对象地址是否相等
有覆写equals方法的情况下:
按覆写的方法比较
1. 一般用于引用数据类型的比较
2. 可以覆写equals方法达到自定义比较的目的


说明:
1.
equals方法源于Object类中的equals方法,该方法中同样使用的是“==”来判断对象地址是否相同,所以没有覆写equals方法的情况下使用equals方法判断的是对象地址是否相等。

2. 比如String类,如果使用“==”,比较的是两个类的内存地址是否相同,如果使用equals方法,比较的是字符串是否相同,因为String类中已经覆盖equals方法了。




作者: 高昌德    时间: 2014-11-6 06:57
二楼正解
作者: LoveStoned    时间: 2014-11-6 08:15
==在比较object时是比较它们的地址   equals可以被覆写,比如String类型的对象,equals比较的是他们的内容是否相同
作者: 空洞的望着窗外    时间: 2014-11-6 08:41
二楼回答的正确,
作者: 想成为黑马    时间: 2014-11-6 09:19
==比较的是地址,equals比较的是里面的内容
作者: 菜鸟一号    时间: 2014-11-6 09:26
基本的数据类型用"==",引用类型用equals(),而equals()比较的是两者的地址,一般要重写equals方法
作者: 高昌德    时间: 2014-11-6 11:19
hailong 发表于 2014-11-5 23:32
==是比较运算符,比较基本数据类型,比较具体数值是否相等,==两边是引用数据类型时,比较的是两个对象的内 ...

Object obj1 = new Object();
Object obj2 = new Object();
1:System.out.println(obj1==obj2);
2:System.out.println(obj1.equals(obj5));
            
Object obj3 = 223;
Object obj4 = 223;
3:System.out.println(obj3==obj4);
4:System.out.println(obj3.equals(obj4));

1和2:false false
3和4:false true
可不可以理解为obj1和obje2是两个对象,Object类型没有复写equals()方法,所以无论==还会equals()都为false;
obj3和obj4也是两个对象,但是Integer类型复写了equals()方法,所以==是false,equals()是true.
但obj3和obj4不是object类型的吗?难道赋值时自动装箱,还是多态的问题,父类引用指向子类对象?


作者: hailong    时间: 2014-11-6 22:25
高昌德 发表于 2014-11-6 11:19
Object obj1 = new Object();
Object obj2 = new Object();
1:System.out.println(obj1==obj2);

3和4是多态,而且Integer重写了equals方法,使用了自己特有的比较方式
  1. Integer重写后的equals方法:
  2.     public boolean equals(Object obj) {
  3.         if (obj instanceof Integer) {
  4.             return value == ((Integer)obj).intValue();
  5.         }
  6.         return false;
  7.     }
复制代码
重写后比较的是具体的值,而不再是内存地址了

作者: jeromechen    时间: 2014-11-6 22:53
这是张孝祥老师总结的,非常全面,之前我也是理解的就那么想当然,没有深入原理,和大家分享下:

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

作者: 王世虎    时间: 2014-11-7 01:02
坐看7楼大神~~~
作者: zhangyangLengen    时间: 2014-11-7 07:31
二楼正解
作者: M_______r    时间: 2014-11-7 10:12
嗯,学习一下
作者: nyk    时间: 2014-11-7 11:42
jacoblx 发表于 2014-11-6 04:41
我再总结一下

好!!!!




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