在Java中比较引用类型的数据是否相等使用Object类中的equals()方法,equals方法底层比较的是数据的地址。
当比较两个对象是否相等时,我们应该比较对象内部的每个内容是否相等,所以需要重写equals()方法。
String类是SUN编写的,所以String类的equals方法不需要我们自己重写,判断两个字符串是否相等直接使用str1.equals(str2),而判断两个对象是否相等则需要重写equals()方法,案例如下:
public class User {
String name;
Address addr;
// User的有参构造方法
public User(String name, Address addr) {
this.name = name;
this.addr = addr;
}
@Override
//重写equals()方法
public boolean equals(Object obj) {
if(obj==null||!(obj instanceof User)) return false;
if(this==obj) return true;
User u=(User)obj;
//将obj强制转换为User对象
if(this.name.equals(u.name)&&this.addr.equals(u.addr)) return true;
return false;
}
static class Address{
String province;
String city;
public Address(String province, String city) {
this.province = province;
this.city = city;
}
// Address类中重写equals()方法
@Override
public boolean equals(Object obj) {
if(obj==null||!(obj instanceof Address)) return false;
if(this==obj) return true;
Address addr=(Address)obj;
if(this.province==addr.province&&this.city==addr.city) return true;
return false;
}
}
public static void main(String[] args) {
User u1=new User("张三",new Address("山东","烟台"));
User u2=new User("张三",new Address("山东","烟台"));
System.out.println(u1.equals(u2));
}
}
在上面的案例中比较u1和u2是否相等需要比较名字和地址是否相等,比较名字时名字是字符串类型直接调用String类中重写的equals方法,比较地址时,地址是一个引用类型,需要在地址类中重写equals方法才能正确比较地址是否相等,也就是说每个类中都需要重写equals,使用equals方法进行比较时重写要彻底。