需求
有一個類Person,需要判斷Account類的對象account1,account2是否相等。
判斷規(guī)則為,當(dāng)id(int類型判斷是否帶下相等)和department(判斷字符串內(nèi)容是否相等)屬性均相等時(默認(rèn)兩個屬性都必須非空,若有屬性為空則認(rèn)為兩個對象不等),則認(rèn)為該Account類對象相等。
public class Account{
private int id;
private String department;
}
Account account1 = new Account(1,"用戶處");
Account account2 = new Account(1,"用戶處");
以下開始介紹如何判斷自定義類是否按照指定規(guī)則相等。
前提介紹
Java中所有類都繼承自O(shè)bject類,該類擁有equals方法,對象之間比較大小都是默認(rèn)調(diào)用equals方法(可能會重寫該方法),比如最常見的Integer或者String類對象,之間比較大小都是默認(rèn)重寫并調(diào)用了該方法。
下面的String,Integer源碼解析,引用大佬文章,
Java Set對象去重
java.lang.Integer.equals():兩個對象對應(yīng)的值一致則返回true。
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
java.lang.String.equals():兩個字符串對應(yīng)的值一致則返回true:
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;//anObject不是String實例,那么返回false
}
而如果不重寫該方法,默認(rèn)調(diào)用的是java.lang.Object.equals()方法:兩個對象的引用是否一致,即兩個的對象是否是同一個。
public boolean equals(Object obj) {
return (this == obj);
}
但是我要比較自定義的值是否相等,并不希望是比較兩者之間的引用是否相等,而是需要當(dāng)判定他們的全部屬性相等時則認(rèn)為他們相等。
對于自定義對象進(jìn)行比較
所以根據(jù)上面的先驗知識,知道要對于自定義對象按照自定義規(guī)則比較是否相等,肯定得重寫equals方法。
如下:
@Override
public boolean equals(Object object){
if(object == null){
return false;
}
if(object == this){
return true;
}
if(object instanceof Account){
Account account = (Account) object;
try{
if(account.id == this.id && account.department.equals(this.department)){
return true;
}
}
catch(Exception e){
//對象的屬性不全,則返回false
return false;
}
}
return false;
}
HashSet判斷兩個元素相等的標(biāo)準(zhǔn)是兩個對象通過hashCode()方法返回的值相等并且兩對象通過equals()方法比較相等,所以如果將對象輸入在HashSet中,光是實現(xiàn)equals方法還是無法實現(xiàn)去重的效果,必須還得同時重寫hashCode方法。
因為在HashSet插入新元素流程中,先根據(jù)hashCode方法獲得對象的hashCode值,然后通過hashCode值計算得到hash值決定該對象在HashSet中的存儲位置。
然后再通過equals比較,如果equals返回值為false,那兩個元素還是不會被認(rèn)定為同一元素,hashSet會在這個位置用鏈?zhǔn)浇Y(jié)構(gòu)保存新加入的元素。
hashCode方法如下:文章來源:http://www.zghlxwxcb.cn/news/detail-564845.html
@Override
public int hashCode(){
try{
return id.hashCode() + department.hashCode();
}catch(Exception e){
Random random = new Random();
return random.nextInt(100);
}
}
總結(jié)
如果想要實現(xiàn)自定義對象在HashSet實現(xiàn)自定義規(guī)則去重,需要重寫自定義對象的hashCode和equals方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-564845.html
到了這里,關(guān)于java中怎么比較兩個自定義實體對象是否相等(比如在Set數(shù)據(jù)結(jié)構(gòu)中去重)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!