黑马程序员技术交流社区

标题: java中的 == 和 equals() 方法的区别 [打印本页]

作者: 海中的游弋草    时间: 2011-12-20 14:01
标题: java中的 == 和 equals() 方法的区别
本帖最后由 海中的游弋草 于 2011-12-20 18:05 编辑

public class EqualsTest
{
        public static void main(String[] args)
        {
                Student s1 = new Student("zhangsan");
                Student s2 = new Student("zhangsan");
      System.out.println(s1 == s2);//false;  这里为false的原因?       
      System.out.println(s1.equals(s2));//true; 这里为true的原因?

        }
}
class Student
{
        String name;
public Student(String name)
        {
                this.name = name;
        }
        public boolean equals(Object anObject)
        {
                if(this == anObject)
                {
                        return true;
                }
       if(anObject instanceof Student)
                {
                        Student student = (Student)anObject;
                                if(student.name.equals(this.name))
                        {
                                return true;
                        }
                }
        return false;
        }
}
作者: 冯瑞君老师    时间: 2011-12-20 14:07
在JAVA中,==与equals都有比较判断对象是否相等的作用,==是运算符号,而equals则属于方法。

   
作者: 舒远    时间: 2011-12-20 14:11
很简单:==是判断两个对象地址是否相等。
equals方法是每个对象都有的。直接从Object对象继承过来!不同对象equals的实现是不一样的。
在你的例子中,String类的equals方法是比较两个字符串对象的字符序列是否完全相同。简单说就是比较字符串的值是不是一样。他不是比较的字符串的地址。
其实明白一句话就行,通常都是==比较对象地址,equals比较实际值!
作者: 刘基军    时间: 2011-12-20 14:15
1.System.out.println(s1 == s2);//false;  这里为false的原因?  
这个比较的是s1与s2是对象的引用,存放的对象的地址值,你前边new了两个对象,s1与s2分别指向对应的对象,所以s1的值肯定不同于s2
2.System.out.println(s1.equals(s2));//true; 这里为true的原因?
你在Student类中重写了equals()方法,比较细节就按你定义的来,
public boolean equals(Object anObject)
        {
                if(this == anObject) //a.这就是上面刚讲的的比较,所以this不等于anObject,继续向下执行
                {
                        return true;
                }
       if(anObject instanceof Student) //b.anObject实际就是Student类的实例
                {
                        Student student = (Student)anObject;
                        if(student.name.equals(this.name)) //d.这边可以看出equals实际就是比较对象的name属性,name是String类型,查看API可知,String类的equals()就是比较两个字符串的内容是否相等,“zhangsan”等于“zhangsan”,所以最终返回true
                        {
                                return true;
                        }
                }
        return false;
        }

作者: 王胜利    时间: 2011-12-20 15:02
"=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用"=="操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Object 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。

注意:字符串的比较基本上都是使用equals方法。
作者: 海中的游弋草    时间: 2011-12-20 16:46
王胜利 发表于 2011-12-20 15:02
"=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要 ...

谢谢!解析的真细!不错值得学习!
作者: 黑马巩伟伟    时间: 2011-12-20 16:55
当用==来判断两个对象时,判断的是两个对象在内存中的地址。而equals是判断两个对象的地址指向的值。
作者: hello world    时间: 2011-12-20 17:25
本帖最后由 刘向阳 于 2011-12-20 17:27 编辑

这是因为你构造了两个对象,虽然看起来一样,但是这两个对象在内存中是以不同的地址存储的,引用变量s1,s2是对这两个对象的引用,类似于C语言中的指针,==用于比较这两个引用变量是否指向了同一个对象,所以s1==s2的结果是false,而equals方法对String类对Object类中的equals方法的覆盖,作用就是不再比较两个对象的引用是否相同,而是比较两个对象中存储的内容是否相同。
作者: 刘博    时间: 2011-12-20 17:32
==比较的是地址,你上面两个都是new的对象,所以是false而equals默认的是Object里的equals也是默认的比较地址,而你从写了equals方法,所以是true
作者: 刘健    时间: 2011-12-20 17:34
==判断的是对象是否是同一对象,equals在String下是判断字符串是否完全一致
作者: 窦超    时间: 2011-12-20 17:51
==判断地址是否一致,equals则判断值是否相等。只要用了new地址就不相等了。
作者: 陈帅雷    时间: 2011-12-20 17:56
对于字符串变量来说,使用“= =”和“equals()”方法比较字符串时,其比较方法不同。 “= =”比较两个变量本身的值,即两个对象在内存中的首地址。 “equals()”比较字符串中所包含的内容是否相同。 比如:String s1 = new String("abc"); String  s2 = new String("abc"); 那么: s1= =s2 是 false      // 两个变量的内存地址不一样,也就是说它们指向的对象不 一样, 故不相等。 s1.equals(s2) 是 true     //两个变量的所包含的内容是abc,故相等。
作者: wsssx    时间: 2011-12-20 18:09
提示: 作者被禁止或删除 内容自动屏蔽




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