首先先看一下Object equals()方法,equals()方法用于判断两个对象是否相等,比较两个对象的引用地址。Java中所有的类均默认继承Object类,也就是说Object类是所有类的基类。代码如下:
public boolean equals(Object obj) {
return (this == obj);
}
最常用的String类也重写了Object类中的equals()方法,用于判断两个对象的内容是否相等,并且在equals()方法中采用了instanceof关键词来判断对象所属的实例,代码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
以下代码示例说明了对List集合对象中的数据进行去重操作处理,并重写了泛型类中的equals()和hashCode()方法
public class CardSampleConfig {
@Override
public boolean equals(Object object) {
if (null == object || getClass() != object.getClass()) {
return false;
}
CardSampleConfig cardSampleConfig = (CardSampleConfig) object;
return sampleCode.equals(cardSampleConfig.getSampleCode()) && sampleName.equals(cardSampleConfig.getSampleName());
}
@Override
public int hashCode() {
String hashStr = sampleCode + sampleName;
return hashStr.hashCode();
}
}
public List<CardSampleConfig> findSampleNoRelatedQRCodeProviderList(String toonType) {
List<CardSampleConfig> qrCodeSupplierSampleConfigList = getRelatedQRCodeProviderOfSampleList(toonType);
if (null == qrCodeSupplierSampleConfigList) {
return null;
}
List<CardSampleConfig> cardSampleConfigList = cardSampleConfigMapper.querySampleListByCardToonType(toonType);
// 先移除自身所包含另一个集合中的对象
cardSampleConfigList.removeAll(qrCodeSupplierSampleConfigList);
// 将另一个集合的对象再次添加进来
cardSampleConfigList.addAll(qrCodeSupplierSampleConfigList);
cardSampleConfigList = new ArrayList<>(new HashSet<>(cardSampleConfigList));
return cardSampleConfigList;
}
最后,如果需要对equals方法重写,需要遵守通用约定(equals实现了等价关系):
自反性:x.equals(x)必定返回true;
对称性:x.equals(y)返回true时,y.equal(x) 必定返回true
传递性:x.equals(y)且y.equals(z)返回true时,x.equals(z)必定返回true
一致性: 如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
非空性: 任何非空的引用值X,x.equals(null)的返回值一定为false