equals()方法的使用
equals()
是一个方法,而非运算符,并且只能适用于引用数据类型。
Object
类中equals()
的定义:
public boolean equals(Object obj) {
return (this == obj);
}
Object
类中定义的equals()
和==
的作用是相同的,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体。
String
类中equals()
的定义:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Date
类中equals()
的定义:
public boolean equals(Object obj) {
return obj instanceof Date && getTime() == ((Date) obj).getTime();
}
像String
、Date
、File
、包装类等都重写了Object
类中的equals()
方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。
public class EqualsTest {
public static void main(String[] args) {
Customer customer1 = new Customer("小明");
Customer customer2 = new Customer("小明");
System.out.println(customer1.equals(customer2));
String string1 = new String("str");
String string2 = new String("str");
System.out.println(string1.equals(string2));
Date date1 = new Date(32131535131L);
Date date2 = new Date(32131535131L);
System.out.println(date1.equals(date2));
}
}
输出结果:
equals()方法的重写
通常情况下,我们自定义的类如果使用equals()
的话,也通常是比较两个对象的"实体内容"是否相同。那么就需要对Object
类中的equals()
进行重写。重写的原则:比较两个对象的实体内容是否相同。
class Customer{
String name;
int age;
//重写其equals()方法
public boolean equals(Object obj){
if(obj == this){
return true;
}
if(obj instanceof Customer){
Customer cust = (Customer)obj;
return this.age == cust.age && this.name.equals(cust.name);
}
return false;
}
}
字符串常量的比较
还需要注意字符串常量的比较,字符串常量是放在字符串常量池中实现复用。
例如
String s1 = "str";
String s2 = "str";
System.out.println(s1 == s2);
String s3 = new String("str");
String s4 = new String("str");
System.out.println(s3 == s4);
输出结果:
当使用s1 = "str";
进行赋值时,字符串常量是放在方法区的常量池里面的,所以当s2 = "str"
时,会复用常量池中的字符串"str",所以使用==
进行比较时,比较的是同一个地址值,所以返回true
。但是使用new String("str")
是在堆区创建了一个String
类型的对象,再使用==
进行比较时,两个地址值不一样,所以返回false
。