Fork me on GitHub

“==”符号与equals()的“爱恨情仇”

==操作符和equals()方法

==操作符与equals()方法

  • ==:

    1. 基本类型的比较,只要两值相等即为true。
    int a=5;
    int b=5;
    System.out.println(a==b);
    

    运行结果:

    true

    引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,==才返回true。

    package Demo01;
    
    public class Application {
        public static void main(String[] args) {
            p1=new Person();
            Person p2=new Person();
            Person p1=p2;    
           System.out.println(p1=p2);
        }
    }
    
    

    运行结果:

    true

    用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换基本数据类型除外),否则编译出错

  • equals():

    所有类都继承了Object,也就获得了equals()方法,还可以重写。

    只能比较引用类型,其作用与“==“相同,比较是否指向一个对象。

    格式:obj1.equals(obj2)

    特例:当用equals()方法进行比较时,对类File、String、Date及包装类(Wrapper class)来说,是比较类型及内容而不是考虑引用的是否是指向同一个对象;

  • 对于String,”==“是比较对象的内存地址,equals是比较内容(值)

"=="和equals ()方法的区别

== 运算符:

  1. 可以使用在基本数据类型变量和引用数据类型变量中。

  2. 如果比较的是基本数据变量:比较两个变量的数据是否相等。(不一定类型要相同)

    如果比较的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体。

    补充:==符号使用时,必须保证符号两边的变量类型一致

    Student student=new Student();
    Student student1=new Student();
    System.out.println(student==student1);
    

    运行结果:false

    Person person=new Student("周一",22,123456);
    Student student=new Student("周一",22,123456);
    System.out.println(person==student);
    

​ 运行结果:false

equals()方法:

  1. 是一个方法,而非运算符

  2. 只适用于引用数据类型

  3. Object类中equals()的定义:

    public boolean equals(Object object){
        return (this==object)
    }
    

    说明:Object类中定义的equals()和==的作用是相同的,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体

  4. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用地址是否相同,而是比较两个对象的“实体内容”是否相同。

  5. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的”实体内容“是否相同。那么我就需要对Object类中的equals()方法进行重写

  6. 重写原则:比较两个对象的实体内容,即(name和age是否相同)

    重写equals()方法,对两个对象的实体内容进行比较:

    //重写equals()方法
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if(obj instanceof Person){
                Person person=(Person)obj;//低转高,需强制类型转换
                  if(person.age==((Person) obj).age && person.name.equals(((Person) obj).name)){
               /*
                 name是String类型,如果用"=="运算符进行比较,只会比较的是地址,而不是属性的内容,所以              用equals()方法进行比较String类型的内容是否相同
               */
                      return true;
                  }else {
                      return false;
                  }
               }
            return false;
            }
    

==和equals()的区别总结:

  1. ==既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址
  2. equals()的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals()是比较值的错误观点
  3. 对equals的比较具体要看自定义类里有没有重写Object的equals方法来判断。
  4. 通常情况下,重写equals方法,会比较类中的相应属性是否相等。
posted @ 2020-11-24 09:23  乐二啊  阅读(111)  评论(0)    收藏  举报