首页
登录 | 注册

运算符==和equals()的区别

   Object类是java中所有类的祖先,所有的类都从Object中继承一些变量和方法,在Object类中定义的equals方法可以测试两对象是否为同一对象,在Object类中equals方法只是简单的使用==运算符测试两个引用值是否相等,即a.equals(b)和a==b的效果相等;
   但在定义具体的子类时,通常会重新定义equals()的方法,而不仅仅是测试两个引用值是否相等,在String类中equals()是测试两个字符串中的内容是否相等,而运算符==是测试两字符串的是否为同一字符串,即在内存中所占的位置是否一模一样,
在数组中运算符==和equals()效果相同;
例子:
class Person1{          //此类中由于没有equals()方法,所以使用Object类中的equals()进行比较
    public String name;  
}
class Person2{          //此类中重写了equals()方法
    public String name;
    public boolean equals(Object obj){   //此处重写equals()方法,不会采用Object类中的equals()方法
        Person2 tempObj=(Person2)obj;
        if(tempObj==null)   return false;
        if(this.name==null) return false;
        if(this.name.equals(tempObj.name))  //此处采用Object类中的equals()方法
            return true;
        else    return false;
    }
}
public class Test{
    public static void main(String[] args){
        Person1 p=new Person1();
        p.name="zhangsan";
        Person1 p1=new Person1();
        p1.name="zhangsan";
        Person2 p2=new Person2();
        p2.name="zhangsan";
        Person2 p3=new Person2();
        p3.name="zhangsan";
        System.out.println(p.equals(p1));
        System.out.println(p==p1);
        System.out.println(p.name==p1.name);
        System.out.println(p2.equals(p3));
        System.out.println(p2==p3);
        System.out.println(p2.name==p3.name);
    }
}
执行的结果:
false
false
true
true
false
true
第一个equals()是采用Object类中的equals()方法比较两个类的实例,而非String型的,因此比较的两实例是否为相同的两实例,即指向同一内存;
第二个equals()是先采用Person2类中的equals()方法进行比较,再用Object类中的equals()方法比较实例中的name,而p2.name和p3.name均是字符串,所以
比较的是其中的内容,所以相同。

相关文章

  • Java基础12:深入理解Class类和Object类
    这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Ja ...
  • "作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的.事实上,Java本来就是从C++衍生出来的." 然而,C++和Java之间仍存在一些显著的差异.可以这样说,这些差异代 ...
  • Java运算符: 自增和自减: 放在前面是先把变量的值加1或者减1,在参与表达式的计算. 放在后面是先参与表达式的计算,在把变量的值加1或者减1. java运算符: 1. 赋值运算符: =  2. 算术运算符: +,-,*,/ 3. 自增和 ...
  • 发现做了这么多年的嵌入式开发,还有朋友搞不清楚stack & heap的区别,在阅读<Operating Systems_Three Easy Piece>时,里面的一段解释觉得非常好! C programs use t ...
  • 广州.Net培训龙头:广州传智播客解惑C#中const与readonly的区别
     C#中const与readonly的区别     广州.Net培训的学员中很多都不清楚const与readonly的区别,所以在此广州传智.Net学院特此出文解惑const与readonly的区别 在日常的编码实践中,我们都知道,对于常量 ...
  • 关于java和javascript的关系,我曾在一个论坛上看过这样一句话,java和javascript的关系,就好比雷锋和雷峰塔的关系,实在是经典! 因为名字的关系,总是有人误以为Javascript是Java的一个子集,或者必然会存在一 ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.012 s.
京ICP备10005923号