HashSet加入的對象需要重寫hashCode方法和equals方法,因爲對於自定義類需要提供判斷怎樣纔算重複元素的方法。
本例中的hashCode方法和equals方法即是用來判斷student對象是否爲重複對象的標準方法。
個人理解就是 hashset內部會把集合中每個元素都回去依次計算hashcode放到一個地方存儲
依次向下計算,如果發現hashcode值在該存儲中已存在,則去調用equals方法
去判斷是否爲相同屬性的對象,若是則返回true,如果不是則返回false
如果屬性值相同則返回true,不同則返回false,如果equals方法返回的是true則hashset則會對該數據進行去重,不會添加該數據到集合中,如果返回的是false,則hashset不會進行去重操作,會添加該數據到集合中
測試代碼用例如下
@PrepareForTest({ ZcxFactory.class, ArteryNormalCodeUtil.class })
public class SjrhServiceTest {
@Test
void testlistUNION() {
Code code1 = new Code("1", "2", "3"); Code code2 = new Code("1", "2", "3");
Code code3 = new Code("1", "2", "3"); Code code4 = new Code("1", "2", "4");
List<Code> aa = new ArrayList<>();
aa.add(code1);
aa.add(code2);
aa.add(code3);
HashSet<Code> bb = new HashSet<>();
//bb.addAll(aa);
bb.add(code1); 第一次會 去調hashcode,但不會去調equals方法
bb.add(code2);這裏還是先去調hashcode計算,該值存在,所以回去調equals方法來判斷 是否爲屬性相同的對象
bb.add(code3);這裏還是先去調hashcode計算,該值存在,所以回去調equals方法來判斷 是否爲屬性相同的對象
bb.add(code4); 這裏還是先去調用hashcode計算,該值不存在 所以不會去調用equals 方法來進行判斷
List<Code> cc = new ArrayList<>();
cc.addAll(bb);
for (Code code : cc) {
System.out.println(code);
}
}
}
實體類:
public class Code {
private String NBh;
private String NDm;
public Code(String nBh, String nDm, String cMc) {
super();
NBh = nBh;
NDm = nDm;
CMc = cMc;
}
private String CMc;
/**
*
*/
public Code() {
super();
}
/**
* @return the nBh
*/
public String getNBh() {
return NBh;
}
/**
* @param nBh
* the nBh to set
*/
public void setNBh(String nBh) {
NBh = nBh;
}
/**
* @return the nDm
*/
public String getNDm() {
return NDm;
}
/**
* @param nDm
* the nDm to set
*/
public void setNDm(String nDm) {
NDm = nDm;
}
/**
* @return the cMc
*/
public String getCMc() {
return CMc;
}
/**
* @param cMc
* the cMc to set
*/
public void setCMc(String cMc) {
CMc = cMc;
}
@Override
public int hashCode() {
int result = CMc.hashCode()+ NBh.hashCode()+NDm.hashCode();
return result;
}
@Override
public boolean equals(Object obj) {
Code cs = (Code) obj;
if (!CMc.equals(cs.CMc)) {
return false;
}
if (!NBh.equals(cs.NBh)) {
return false;
}
return NDm.equals(cs.NDm);
}
@Override
public String toString() {
return "Code [NBh=" + NBh + ", NDm=" + NDm + ", CMc=" + CMc + "]";
}
}
}