java中‘==’与‘.equals()‘的区别

java中比较两者是否相等,经常会涉及到== 与equals() 的使用。
== 是作为java中的一个运算符,'equals’则是根父类Object中定义的一种方法。 (注,Object类中’equals()‘的定义中是使用了’=='进行判断)
这两者既有可相互替换使用的时候,也有不可替代之时。

二者的使用情景主要有三种情况:
①基本数据类型的比较
②String,File,Date以及包装类等引用数据类型的比较
③自定义类的比较

1:基本数据类型的比较
虽然java是面向对象的语言,但是基本数据类型并不属于java中的类。因此对于基本数据类型来说,不能使用equals()进行判断,只能使用“ ==”进行判断。!

		int a = 10;
        double b = 10.0;
        char c = 10;
        System.out.print("a是否等于b: ");
        System.out.println(a == b);
        System.out.print("a是否等于c:");
        System.out.println(a == c);
        System.out.print("b是否等于c: ");
        System.out.println(b == c);`

在这里插入图片描述

2:String、File、Date等引用数据类型的比较

当使用 '=='进行同类判断时,比较的是两者的地址值是否相等。
因此在引用数据类型比较时,我们几乎不会使用 == 来判断二者是否相等。

而当使用equals()进行判断时,对于这些类而言,他们在本类中都对equals() 进行了重写,以便于我们的使用,比较的是“实体内容”是否相等。
例如,下图为在String类中对equals()的重写:
在这里插入图片描述

3:自定义类的比较

同上,当使用== 进行判断时,比较的也是这两者的首地址值是否相等。
而当直接使用 'equals()'进行判断时,由于前面提到的,即在根父类Object的定义的equals() 方法是使用了== 进行判断,因此,此时使用的equals()方法作用仍等同于 '=='的方法。
Object类中equals()定义如图:
在这里插入图片描述

因此,在实际使用过程中,我们经常需要在子类的定义中重写equals()方法,使得之后在使用equals()方法时比较的是两者的实体内容是否相同,以达到我们的使用预期。

测试:
首先定义一个简单的Customer类,属性有name,age。 此时未重写equals()方法,因此比较的是两个Customer类的对象的首地址是否相同。

public class CustomerTest {
    public static void main(String[] args) {
        Customer c1 = new Customer("Tom", 26);
        Customer c2 = new Customer("Tom", 26);
		System.out.print("未重写equals()方法:");
        System.out.println(c1.equals(c2));
    }
}

在这里插入图片描述

当在Customer类中进行重写equals()方法后:

public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Customer customer = (Customer) o;
        return this.age == customer.age && this.name.equals(customer.name);
    }

此时比较的便是Customer中属性name,age的值是否相等:
在这里插入图片描述


版权声明:本文为m0_51608444原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。