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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© joechen 中级黑马   /  2013-10-31 20:33  /  1646 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

equals和==到底应当怎么区别?
以下三组结果分别怎么解释,谢谢
class  Demo
{
        public static void main(String[] args)
        {
                Person p1=new Person("zhansan",20);
                Person p2=new Person("zhansan",20);

                System.out.println(p1.equals(p2)+"---"+(p1==p2));//false false   
                String s1=new String("lisi");
                String s2=new String("lisi");
                System.out.println(s1.equals(s2)+"---"+(s1==s2));//true false
                String s3="lisi";
                System.out.println(s1.equals(s3)+"---"+(s1==s3));//true false

        }
}
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
}

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

13 个回复

倒序浏览
Object中的equals()方法比较的是地址  ==符号也是比较的地址  第一组结果两个都是比较地址 所以都为false   第二组结果String重写了Object类的equals()方法 比较的是其内容 所以结果为true  false  第三组结果和第二组一样 第一个用equals()比较是比较内容 所以结果是true  false
回复 使用道具 举报
ixiangfeng 发表于 2013-10-31 20:49
Object中的equals()方法比较的是地址  ==符号也是比较的地址  第一组结果两个都是比较地址 所以都为false   ...

完全没听懂。。
回复 使用道具 举报
1.equals方法可以被重写,而且推荐将euqals和hashcode两个方法一起重写,之后比较的是hashcode,
  不重写equals方法的话,会调用父类的equals方法,如果追溯到Object的话 euqals 就是 ==
   ==这个不能被重写,比较的是是否指向同一个对象实例
2.equals方法的参数是Object,所以两者不需要是同一类型的对象
  ==如果两者不是相同类型,编译器会报错
你这个例子是因为String重写了equals方法

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
零下五度的水 发表于 2013-10-31 20:56
1.equals方法可以被重写,而且推荐将euqals和hashcode两个方法一起重写,之后比较的是hashcode,
  不重写e ...

你的回答比上面的好。但是我没有分。。呵呵
回复 使用道具 举报
零下五度的水 发表于 2013-10-31 20:56
1.equals方法可以被重写,而且推荐将euqals和hashcode两个方法一起重写,之后比较的是hashcode,
  不重写e ...

有点懂了,谢谢
回复 使用道具 举报

回答得比较急 不过你技术分都这么高了不应该连这个都不知道的啊 或者你看看你帖子下面的相关帖子吧 里面会有详细说明的
回复 使用道具 举报
==用在基本类型上是比较基本类型的值是否相等,用在对象之间比较,是比较两个对象的引用内存地址是否相同,也就是是否是同一个对象的引用!
equals()用来比较对象里边的内容或是值是否相等!比如字符串比较就是比较两个字符串的值是否相等了!自定义类需要重写equals()方法来实现比较!
举例:
String s1 = null;
String s2 = null;
System.out.println(s1==s2);//true
//System.out.println(s1.equals(s2));//NullPointerException
s1 = s2;
System.out.println(s1==s2);//true
//System.out.println(s1.equals(s2));//NullPointerException
System.out.println("***1***");

s1 = null;
s2 = "";
System.out.println(s1==s2);//false
//System.out.println(s1.equals(s2));//NullPointerException
s1 = s2;
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("***2***");

s1 = "";
s2 = null;
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//false
s1 = s2;
System.out.println(s1==s2);//true
//System.out.println(s1.equals(s2));//NullPointerException
System.out.println("***3***");

s1 = "";
s2 = "";
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
s1 = s2;
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("***4***");
s1 = new String("");
s2 = new String("");
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true
s1 = s2;
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("***5***");

s1 = "null";
s2 = "null";
System.out.println(s1==s2);//ture
System.out.println(s1.equals(s2));//true
s1 = s2;
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("***6***");
s1 = new String("null");
s2 = new String("null");
System.out.println(s1==s2);//flase
System.out.println(s1.equals(s2));//true
s1 = s2;
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("***7***");

s1 = "abc";
s2 = "abc";
System.out.println(s1==s2);//ture
System.out.println(s1.equals(s2));//true
s1 = s2;
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("***8***");
s1 = new String("abc");
s2 = new String("abc");
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true
s1 = s2;
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("***9***");
回复 使用道具 举报
class  Demo
{
         public static void main(String[] args)
        {
              Person p1=new Person("zhansan",20);
              Person p2=new Person("zhansan",20);
              System.out.println(p1.equals(p2)+"---"+(p1==p2));//false false   
                     /*equals是Object类中的方法,是判断对象是否相同,即判断地址是否一样 ,所以p1.equals(p2)结果是false;而==是比较运算符,p1和p2是各指向两个对象,因此p1!=p2*/
             String s1=new String("lisi");
             String s2=new String("lisi");
             System.out.println(s1.equals(s2)+"---"+(s1==s2));//true false
                    //字符串中的equals方法是重写了object中的equals方法,判断两个字符串是否相同。所以s1.equals(s2)结果是true;而s1和s2是各指向两个字符串变量,因此s1!=s2
             String s3="lisi";
             System.out.println(s1.equals(s3)+"---"+(s1==s3));//true false
                   //这其中涉及到了字符串引用型变量实例化时,先查询内存中是否已经有“lisi”字符串对象,如果有了,则指向该对象。否则,新建字符串对象。所以s1.equals(s3)结果是true,而s1!=s3与第二种情况相同。
        }
}
class Person
{
         private String name;
         private int age;
         Person(String name,int age)
         {
                 this.name=name;
                 this.age=age;
         }
}

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
ixiangfeng 发表于 2013-10-31 21:44
回答得比较急 不过你技术分都这么高了不应该连这个都不知道的啊 或者你看看你帖子下面的相关帖子吧 里面 ...

我是没有基础的水笔:lol,你说的我看懂了
回复 使用道具 举报
马晓平 发表于 2013-10-31 22:42
==用在基本类型上是比较基本类型的值是否相等,用在对象之间比较,是比较两个对象的引用内存地址是否相同, ...

谢谢:lol
回复 使用道具 举报
joechen 发表于 2013-11-1 00:27
我是没有基础的水笔,你说的我看懂了

我也是一样 加油
回复 使用道具 举报
已经重新分类帖子,若问题还没解决,可继续提问。
回复 使用道具 举报
equals比较内容,==比较首地址,equals方法默认是==,所以在比较对象的时候,需要重写equals方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马