黑马程序员技术交流社区

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

作者: keven1119    时间: 2015-3-18 18:43
标题: "=="和equals方法到底有什么区别?
求大神解答!详细点,谢谢。

作者: wkz_crystal    时间: 2015-3-18 19:37
本帖最后由 wkz_crystal 于 2015-3-18 19:43 编辑

其实可以这样理解:我们都知道在java中的数据类型,可分为两大类:
1:对于:基本数据类:byte,short ,int,long,……等就是最为原始的8大数据基类,它们之间在比较时,用(==),比较的是他们的值。
2:而对于:复合数据类型(类)
   当他们用(==)进行比较的时候,比较的是他们在“堆内存”中存放的地址。

但是在java中,很多类都覆盖了Object基类中的equals方法(之前这个方法在Object基础类中的初始值比较的是对象的内存地址),覆盖之有了其自身的实现主体,而不再是比较类在堆内存中的存放地址了(例如String类,就是有了自己的覆盖方法)。对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

实例:
class Test
{
        public static void main(String[] args)
        {       
          String s1="abc";
          String s2=new String("abc");
                if(s1.equals(s2)){ //本来是应该比较对象在堆内存中地址是否相同的,
                                       //但是被String类覆写了equals方法,比较内容去了!
                        System.out.println("yes");
                }else
                {
                        System.out.println("no");
                }
                //所以结果肯定是yes,但是你用“==”,那就是no,因为比较的是地址哈
        }
}

作者: jeasonlzy    时间: 2015-3-18 19:47
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

作者: huhanghao    时间: 2015-3-18 22:50
jeasonlzy 发表于 2015-3-18 19:47
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ...

很不错!
作者: a1301155262    时间: 2015-3-18 22:57
一个比较基本型,一个引用型
作者: keven1119    时间: 2015-3-19 14:40
wkz_crystal 发表于 2015-3-18 19:37
其实可以这样理解:我们都知道在java中的数据类型,可分为两大类:
1:对于:基本数据类:byt ...

很详细,谢谢
作者: keven1119    时间: 2015-3-19 14:41
jeasonlzy 发表于 2015-3-18 19:47
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ...

厉害!!学习了.
作者: 大手牵小手    时间: 2015-3-19 16:15
equals需要地址相同!
作者: Grady    时间: 2015-3-19 20:10
jeasonlzy 发表于 2015-3-18 19:47
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ...

好详细,学习下




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