以前只是在学习java的时候遇到了equals方法,对于重写equals有什么用是一点也不清楚,今天在项目在做比对的时候出了问题,
就试着重写了equals方法,结果就解决了问题。
在开发的时候,经常用到实体类,一般都会这么写
public class MsgDetailsBean {
private String types, content, createtime;
public String getTypes() {
return types;
}
public void setTypes(String types) {
this.types = types;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
@Override
public String toString() {
return "MsgDetailsBean [types=" + types + ", content=" + content
+ ", createtime=" + createtime + "]";
}
}然后项目中有个需求是列表中不能有重复的数据,也就是在刷新列表的时候如果数据有重复就不加载,我是这么写的
for (MsgDetailsBean bean : baseList.getList()) {
if (!msgList.contains(bean)) {
msgList.add(bean);
}
}
结果发现if (!msgList.contains(bean)) 总为true,有数据重复的时候contains方法也认为bean是不同的。
然后我仔细想了想contains比较的是object,而object比较是通过equals来返回true和false的,加上之前有了解过
equals(),所以我就试着重写了MegDetailsBean的equals()
@Override
public boolean equals(Object o) {
if (o instanceof MsgDetailsBean) {
MsgDetailsBean bean = (MsgDetailsBean) o;
if (bean.getCreatetime().equals(createtime)) {
return true;
}
}
return false;
}我是先判断object是不是MsgDetailsBean的类型,如果是的话,就通过唯一的时间戳来判断是否相等,从而达到了自己
想要的效果。
这里相不相等的判断条件应该根据项目实际的需求来定
如果不重写的话,object基类的equals()
public boolean equals(Object o) {
return this == o;
}他是比较实例的,而不断通过new的方式来获取的实例是不可能相等的。 mark。