实体类集合的去重,为什么直接去重不能实现

 实体类集合去重方法有多种,举个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

方法判定的。