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的值是否相等: