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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 海中的游弋草 黑马帝   /  2011-12-20 14:01  /  3598 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 海中的游弋草 于 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;
        }
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

12 个回复

倒序浏览
在JAVA中,==与equals都有比较判断对象是否相等的作用,==是运算符号,而equals则属于方法。

   
回复 使用道具 举报
舒远 黑马帝 2011-12-20 14:11:53
藤椅
很简单:==是判断两个对象地址是否相等。
equals方法是每个对象都有的。直接从Object对象继承过来!不同对象equals的实现是不一样的。
在你的例子中,String类的equals方法是比较两个字符串对象的字符序列是否完全相同。简单说就是比较字符串的值是不是一样。他不是比较的字符串的地址。
其实明白一句话就行,通常都是==比较对象地址,equals比较实际值!
回复 使用道具 举报
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;
        }

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
"=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用"=="操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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方法。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 很给力!

查看全部评分

回复 使用道具 举报
王胜利 发表于 2011-12-20 15:02
"=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要 ...

谢谢!解析的真细!不错值得学习!
回复 使用道具 举报
当用==来判断两个对象时,判断的是两个对象在内存中的地址。而equals是判断两个对象的地址指向的值。
回复 使用道具 举报
本帖最后由 刘向阳 于 2011-12-20 17:27 编辑

这是因为你构造了两个对象,虽然看起来一样,但是这两个对象在内存中是以不同的地址存储的,引用变量s1,s2是对这两个对象的引用,类似于C语言中的指针,==用于比较这两个引用变量是否指向了同一个对象,所以s1==s2的结果是false,而equals方法对String类对Object类中的equals方法的覆盖,作用就是不再比较两个对象的引用是否相同,而是比较两个对象中存储的内容是否相同。
回复 使用道具 举报
刘博 黑马帝 2011-12-20 17:32:02
9#
==比较的是地址,你上面两个都是new的对象,所以是false而equals默认的是Object里的equals也是默认的比较地址,而你从写了equals方法,所以是true
回复 使用道具 举报
刘健 黑马帝 2011-12-20 17:34:20
10#
==判断的是对象是否是同一对象,equals在String下是判断字符串是否完全一致
回复 使用道具 举报
窦超 黑马帝 2011-12-20 17:51:05
11#
==判断地址是否一致,equals则判断值是否相等。只要用了new地址就不相等了。
回复 使用道具 举报
陈帅雷 黑马帝 2011-12-20 17:56:17
12#
对于字符串变量来说,使用“= =”和“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:09
13#
提示: 作者被禁止或删除 内容自动屏蔽
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马