实体类集合的去重,为什么直接去重不能实现
实体类集合去重方法有多种,举个list实体类集合去重的例子。
开发中常遇到的数据装载模式List<UserVO> userList =new ArrayList<UserVO>();
当UserVO对象出现重复的时候需要考虑去重,但是直接通过以下方法去重无法达到效果。
如:
List<UserVO> newList = new ArrayList<UserVO>();
for (UserVO cd:list) {
if(!newList.contains(cd)){
newList.add(cd);
}
}
原因是contains先调用了indexof方法,而indexof方法又调用了equals方法,如果数据装载格式为:
List<String> sList =new ArrayList<String>();
则可以实现去重。那么问题来了,为什么换成实体类后无法实现?
首先所有类的父类为Object,实体类UserVO没有重写父类的equals方法,因而调用如下方法:
但是String重写了equals方法,所以String类型数据去重可以实现:
所以想要实体类集合实现去重,需要在实体类内重写equals方法:
之后就可以根据一开始提供的方法进行去重,而且不仅仅是List集合,用Set集合装实体类时,
也需要在实体类中重写equals方法,因为Set集合判断实体类是否为同一个时,也是通过equals
方法判定的。