List中保存数据是有序不唯一的,所以经常会出现重复的数据,在我们通过List中的数据对其他数据进行操作时就会出现重复操作,我在进行财务金额计算的时候出现的重复的数据,导致金额数目不对,因此发现去重操作的重要性。
下面介绍几种常用的去重操作的方法:
1、set特性去重
set集合的特点是无序且唯一的,所以可以利用set的特性进行去重操作
//要去重的List
List<String> list;
Set<String> set = new HashSet<>();
//将list的数据全部添加到set集合中,因为set集合通过hash值进行查重,所以重复的数据会被排除出去
set.addAll(list);
//此时的set里的数据就是list集合中去除所有重复值的数据,但顺序也会发生改变
//再将set的数据替换掉list的数据即可达到去重的目的
list = new ArrayList<>();
list.addAll(set);
**注意:**set在进行判断是否相同的时候是根据hash值进行判断的,所以如果你要去重的是你手写的对象,那么你需要重写这个对象的getHashCode()方法。以保证不会去根据在堆内存中的地址去判断是否相同。
2、根据对象中的某个属性或多个属性进行去重
使用的是JDK8 的流式化以及Lambda表达式,其中的关键是给TreeSet一个比较器,所以原理还是利用的set集合的唯一性
//假设对人员信息进行去重
List<User> list;
list = list.stream().collect(Collectors
.collectingAndThen(Collectors.toCollection( () ->
new TreeSet<>(Comparator,comparing(user ->
user.getUsername+ ";" + user.getIDCard()))),ArrayList::new));
//通过姓名和身份证号进行去重
这种方式的好处是可以自由的根据属性进行判断是否重复,但是只在JDK8以上的版本才支持,所以如果你的项目是JDK8以下的版本请果断放弃这种写法。
** 3、** 另外还有List本身的contains()方法,如果去重的是对象,则就要重写对象的equals()方法。
如有不对请大佬指教!