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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋大人-专注 中级黑马   /  2014-6-10 10:21  /  1840 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Equalse{
        String name;
        int age;
}
public class ObjectDemo2{
        public static void main(String args[]){
                Equalse p=new Equalse();
                Equalse q=new Equalse();
                String st1=new String("abc");
                String st2=new String("abc");
                Equalse r=p;
                p.name="abc";
                p.age=12;
                q.name="abc";
                q.age=12;
       
                System.out.println(p.equals(q));
                System.out.println(st1.equals(st2));
                //怎么解释他们的输出结果,为什么会有不同的结果呀
        }
       
}

12 个回复

倒序浏览
p和q都是Equalse的对象,在new的时候会在内存中开辟空间,

当你输出p或q的时候会是两个对象的内存地址,我这的输出是这样的:
P:Equalse@7c6a6484
q:Equalse@2ced55ec
equals()方法比较的是两个字符串的内容,当p和q两个对象变为字符串比较时,比较的是内存地址的字符串,必然不相等.
如果你输出的是 System.out.println((p.name).equals(q.name));
也就是两个对象的name属性时,输出的结果是true
回复 使用道具 举报
p.equals(q);是调用你的Equals类的equals方法,这个equals方法是从Object继承过来的,比较的是对象在内存中的地址值,你的p和q都是new出来的,所以为false
st1.equals(st2); 因为st1和st2都是String类型的对象,查看API可以知道String类对Object类的equals方法进行了复写,复写完之后比较的是两个对象的值是否相等,所以返回true
回复 使用道具 举报 2 0
equals对于字符串,比较的是两个字符串的内容,
对于对象,比较的是内存地址,不过你可以把Equalse的hashset()和equals()方法改了,既可
回复 使用道具 举报
本帖最后由 yogaa 于 2014-6-10 13:01 编辑

q和p是两个不同的对象,内存中存放的地址不一样,Equalse类的equals方法,会比较对象在内存中的地址值,所以返回值false;
而那个str1和str2由于都是String对象,String里重写了equals方法变为只比较字符串内容了,由于都是"abc"所以返回值true;
回复 使用道具 举报
String 类中覆盖了equals 方法,比较的是字符串相不相等,而Equalse类中没有覆盖equals方法,比较的仍是对象的地址
回复 使用道具 举报
马宁 中级黑马 2014-6-10 19:03:02
7#
shisishishisi 发表于 2014-6-10 10:53
p.equals(q);是调用你的Equals类的equals方法,这个equals方法是从Object继承过来的,比较的是对象在内存中 ...

学习了,,,
回复 使用道具 举报
本帖最后由 相濡、彼岸 于 2014-6-10 20:24 编辑

关键就是equals的问题,

System.out.println(p.equals(q)); 中 的 equals方法是继承了Obiect的equals方法,比较的是对象的地址值,显然p和q是俩个对象,所以地址值不同,所以为false。

System.out.println(st1.equals(st2)); 中 的 equals方法是String类里面的equals, String把Object里面的equals复写掉了,有了自己比较的方式,那就是比较字符串的内容是否相同,字符串一旦创建就不能被改变,创建第一个String st1=new String("abc");的时候,常量池中就有了“abc”,创建第2个 String st2=new String("abc");的时候,他会去常量池里面找,发现有“abc”,所以就不创建了,所以st1和st2指向了同样一个“abc”.



另外,字符串写成    String  st1 = "abc";       String  st2 = "abc";       就可以了。   “abc”就是一个具体的对象。

回复 使用道具 举报
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
回复 使用道具 举报
Wokno 中级黑马 2014-6-10 20:41:37
10#
路过看看。。。。。。。。。。。。。
回复 使用道具 举报
说的很好。。。
回复 使用道具 举报
        受教了
回复 使用道具 举报
p与q是继承object的equals方法所以比较的是地址,false。st1与st2是String对象,String有重写object的equals方法,比较的是值,所以为true
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马