List集合中数据用set集合去重复,用set集合去重复数据重写了equals还是没成功!
【用set集合去重复数据,重写equals还是不成功的问题解决思路在文章最后】
需求描述:
因业务需要,通过复杂的代码逻辑从数据库取出数据放入List集合中,涉及多次从访问数据库取出数据放入List集合中,其中会取到相同的数据放入集合,这需要去除这部分重复数据才能将业务继续进行下去;
处理方法:
用set集合来去重;
实现思路:
首先需要重写实体类对象的equals方法,和hashCode方法,然后将List集合中的数据加入set集合中实现数据去重复;
1.重写实体类的equals方法
重写equals方法中需要用哪些字段来判断集合中的数据是否重复? 经过一番考虑之后,决定用一个id字段,因为id自增主键在数据库中是唯一的,如果数据重复它们的id肯定是一致的;
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Teacher other = (Teacher) obj;
if (id != other.id)
return false;
return true;
}
2.重写实体类的ashCode方法 只写id的就可以了或直接返回1;
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + (int) (id ^ (id >>> 32));
return result;
}
或
@Override
public int hashCode()
{
return 1;
}
去重复具体代码:
List<Teacher> teacherList = null;
Set<Teacher> teacherSet = new HashSet<Teacher>();
FieldSelector[] selectors = new FieldSelector[2];
selectors[0] = new FieldSelector();
selectors[0].setFieldName("fundClaimId");
selectors[0].setOperator("contains");
selectors[0].setValue(id);
selectors[1] = new FieldSelector();
selectors[1].setFieldName("fundStatus");
selectors[1].setOperator("!=");
selectors[1].setValue(PiConstant.PROCEDUREFEE_FUND_STATUS_RETURN);
// 通过资金认领id查询老师表数据
teacherList = teachersService.queryTeachers(CALLER,
selectors, 0, Integer.MAX_VALUE);
if (null != teacherList
&& 0 < teacher.size())
{
//加入set集合去重
teacherSet.addAll(teacherList);
}
// 教师表数据
if (null != teacherSet && 0 < teacherSet.size())
{
for (teacher re : teacherSet)
{
//打印出去重后的数据
system.out.println(re.toString());
}
}
出现重写equals用set集合去重复不成功问题:
这个问题一般是因为只重写了equals方法而没重写hashCode方法导致的,所以只要加一个hashCode方法就OK了;
因为在数据中先判断哈希值是否相同,后才会去判断equals的值,所以实体类对象中的hashCode必须重写;
科补hashCode() 方法工作原理
简单地说,hashCode() 方法通过哈希算法生成一个整数值。
相同的对象(通过equals方法判断)返回相同哈希值。
hashCode()方法的算法约定为:
-
在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
-
两个相对的对象(通过equals方法判断)必须返回相同哈希值。
-
两个不相对的对象(通过equals方法判断),调用hashCode()方法返回值不是必须不相等。但开发者需了解,不同对象返回不同的哈希值会提升效率。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
工具自动生成equals方法和hashCode():
在实体类中鼠标右键点击Source