我们知道set是无序且不重复的,但set不能去重我们自己定义的实体类,如果想根据一定的规则去重实体类,比如如果这个实体类中的ID相同就去重,这时候我们就要在这个实体类中重写hashCode和equals方法,
/**
* 对象去重就必须重写hashCode和equals方法,(系统类已经重写)
* set是无序且不重复的,set的底层add方法是基于map的put的方法,map的K又基于Object的hash值
* 我们知道每个对象被new出来他们的物理地址hash都不一样,所以在set去重对象的时候不太适用,我们需要重写hashCode和equals方法
* set去重时会先判断hashCode,如果hashCode不同则直接add,如果相同会去equals,他们是&&的关系,都想同则为一个对象
* 现在我们将去重改成,如果对象中的orderNumber属性的值相同就去重
测试直接返回1,ok,但是每个对象的hashCode都一样,会多次去判断equals去重,效率低下,所以返回动态hashCode
@Override
public int hashCode(){
return 1;
}
*/
@Override
public int hashCode(){
int result=17;
result=31*result+orderNumber.hashCode();
return result;
}
@Override
public boolean equals(Object obj){
super.equals(obj);
if(obj==null){
return false;
}
TechnologyStatement te=(TechnologyStatement)obj;
if(this.getOrderNumber().equals(te.getOrderNumber())){
return true;
}
return false;
}
参考:https://baijiahao.baidu.com/s?id=1576860126059183009&wfr=spider&for=pc&isFailFlag=1