在Java中比较两个对象我们知道不能使用==
来进行比较,例如在比较两个字符串时要使用equals
方法来比较。但这里需要注意的是String、Integer等一些包装类已经替我们重写了equals
方法,下面是String类的equals
方法
public boolean equals(Object anObject) {
//如果对象是自己的引用则直接返回true
if (this == anObject) {
return true;
}
//判断是否是String类型
if (anObject instanceof String) {
String anotherString = (String)anObject; //将对象转换为String类型
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;
}
因此,如果我们自己定义的对象如果直接使用equals
方法是会出问题的,因为Object
默认的equals
的实现方法如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以看到Object
的equals
方法中是和自己引用做比较,也就是比较的内存地址,和==
的效果相同,所以如果你创建了两个字段一摸一样的对象,在没有重写equals
方法是,调用equals
方法比较会始终为false
。
下面我们定义一个类,并且创建两个这个类的对象进行比较进行演示。
import java.util.Objects;
public class ObjectA {
private String objectName;
private String objectSize;
private String objectDescribe;
public ObjectA(String objectName, String objectSize, String objectDescribe) {
super();
this.objectName = objectName;
this.objectSize = objectSize;
this.objectDescribe = objectDescribe;
}
}
测试类
public class ObjectTest {
public static void main(String[] args) {
ObjectA a1 = new ObjectA("test", "123", "test");
ObjectA a2 = new ObjectA("test", "123", "test");
System.out.println(a1.equals(a2));
}
}
上面这俩个对象的字段完全相同,但是返回的是false,原因就是上面说的它使用的是Object默认的equals
。下面我们重写equals
。
需要注意的是重写equals()
时也必须重写hashCode()
方法,hashCode()
方法说将对象的地址转换为整数返回,如果不重写hashCode()
方法的话在使用集合的时候会有问题,如HashMap。因此需要将它两同时重写。
重写后的代码
import java.util.Objects;
public class ObjectA {
private String objectName;
private String objectSize;
private String objectDescribe;
public ObjectA(String objectName, String objectSize, String objectDescribe) {
super();
this.objectName = objectName;
this.objectSize = objectSize;
this.objectDescribe = objectDescribe;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return Objects.hash(objectName, objectSize, objectDescribe);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || !(obj instanceof ObjectA)) {
return false;
}
ObjectA temp = (ObjectA) obj;
return temp.objectName.equals(objectName) && temp.objectSize.equals(objectSize)
&& temp.objectDescribe.equals(objectDescribe);
}
}
再次测试打印为true。