在日常业务开发中,偶尔会遇到需要去除List集合中重复数据的场景。这时候可能有同学会问:为什么不直接使用Set或者LinkedHashSet呢?这样复制数据不就没有问题了吗?不得不说,能提出这个问题的同学都很机智,一眼就看出了问题的本质。但是,在实际业务发展中遇到的情况会更加复杂。比如List集合可能是历史遗留的问题,也可能是调用接口返回类型的限制,只能用List接收,或者代码写到一半,才发现这个问题合并多个集合时。出现问题的原因有很多,这里就不一一列举了。发现这个问题后,如果可以通过改造原来的代码,把原来的List类型换成Set类型,那么直接修改集合的类型就可以了。但如果根本无法修改,或者修改成本太高,那么下面6种去重方法将帮你解决问题。在正式开始前置知识之前,我们先来了解两组概念:无序集合和有序集合&无序和有序。因为这两组概念在下面方法的实现中会被反复提及,所以在正式开始前有必要先弄清楚。无序集合无序集合是指读取数据的顺序与插入数据的顺序不一致。比如集合的插入顺序是:1、5、3、7,而集合的读取顺序居然是:1、3、5、7。有序集合的概念正好与概念相反的无序集合。就是说集合的读取顺序和插入顺序是一致的。比如插入数据的顺序是:1、5、3、7,那么读取的顺序也是:1、5、3、7。有序和无序通过上面的无序集合和有序集合,我们可以得到秩序和混乱的概念。顺序是指数据按照我们的预期排列和读取的顺序称为顺序。乱序是指数据的排列顺序和读取顺序不符合我们的预期,称为乱序。PS:如果你对有序和无序的概念不是很清楚也没关系。通过下面的例子,我们可以进一步理解它们的含义。方法一:包含判断去重(有序)去重数据,我们首先想到的是新建一个集合,然后循环原集合,每次判断原集合中的循环项,如果当前循环数据,新集合中不存在则插入,已存在则丢弃。这样当循环执行的时候,我们就会得到一个没有重复元素的集合。实现代码如下:publicclassListDistinctExample{publicstaticvoidmain(String[]args){Listlist=newArrayList(){{add(1);添加(3);添加(5);添加(2);添加(1);添加(3);添加(7);添加(2);}};System.out.println("原始集合:"+list);方法(列表);}/***自定义去重*@paramlist*/publicstaticvoidmethod(Listlist){//新集合ListnewList=newArrayList<>(list.size());list.forEach(i->{if(!newList.contains(i)){//如果新集合中不存在则插入newList.add(i);}});System.out.println("去重集合:"+newList);}}上面程序执行结果如下:这种方法的优点是:理解起来比较简单,最后的集合也是有序的。这里的顺序是指新集合的排列顺序和原集合的排列顺序。顺序一致;但缺点是实现代码有点多,不够简洁优雅方法二:Iterator去重(unordered)自定义List去重,除了上面newcollection,我们还可以使用iterator循环判断每一项数据,如果当前循环数据,集合中有两份或者两份or更多的副本,删除当前元素,这样循环结束后,也可以得到一个没有重复数据的集合。实现代码如下:publicclassListDistinctExample{publicstaticvoidmain(String[]args){Listlist=newArrayList(){{add(1);添加(3);添加(5);添加(2);添加(1);添加(3);添加(7);添加(2);}};System.out.println("原始集合:"+list);方法_1(列表);}/***使用迭代器去重*@paramlist*/publicstaticvoidmethod_1(Listlist){Iteratoriterator=list.iterator();while(iterator.hasNext()){//获取循环的值Integeritem=iterator.next();//如果有两个相同的值if(list.indexOf(item)!=list.lastIndexOf(item)){//移除最后一个相同的值iterator.remove();}}系统输出.println("移除重复集合:"+list);}}上面的程序执行结果如下:这个方法的实现比上一个方法的实现代码少,不需要创建新的集合,但是这个方法得到的新集合是无序的,即新集合的顺序与原集合不一致,所以不是最佳方案方法三:HashSet去重(无序)我们知道HashSet天生就具有“去重”的特性。那么我们只需要将List集合转化为HashSet集合即可。实现代码如下:publicclassListDistinctExample{publicstaticvoidmain(String[]args){Listlist=newArrayList(){{add(1);添加(3);添加(5);添加(2);添加(1);添加(3);添加(7);添加(2);}};System.out.println("原始集合:"+list);方法_2(列表);}/***使用HashSet去重*@paramlist*/publicstaticvoidmethod_2(Listlist){HashSetset=newHashSet<>(list);System.out.println("去重集:"+set);}}以上程序执行结果如下:该方法的实现代码比较简单,但是缺点是HashSet会自动排序,使得新集合的数据排序与原来不一致收藏。如果对集合的顺序有要求,那么这个方法就不能满足现在的要求。方法四:LinkedHashSet去重(有序)既然HashSet会自动排序,达不到要求,那就用LinkedHashSet,既能去重又能保证集合的顺序。实现代码如下:publicclassListDistinctExample{publicstaticvoidmain(String[]args){Listlist=newArrayList(){{add(1);添加(3);添加(5);添加(2);添加(1);添加(3);添加(7);添加(2);}};System.out.println("原始集合:"+list);方法_3(列表);}/***使用LinkedHashSet去重*@paramlist*/publicstaticvoidmethod_3(Listlist){LinkedHashSetset=newLinkedHashSet<>(list);System.out.println("去重集:"+set);}}上面程序执行结果如下注:从上面的代码和执行结果可以看出LinkedHashSet是目前为止比较简单的实现方式,最终生成的新集合与原始集。是我们可以考虑使用的去重方法。方法五:TreeSet去重(无序)除了上面的Set集合,我们还可以使用TreeSet集合来实现去重功能。实现代码如下:publicclassListDistinctExample{publicstaticvoidmain(String[]args){Listlist=newArrayList(){{add(1);添加(3);添加(5);添加(2);添加(1);添加(3);添加(7);(2);}};System.out.println("原始集合:"+list);方法_4(列表);}/***使用TreeSet去除重复项(无序)*@paramlist*/publicstaticvoidmethod_4(Listlist){TreeSetset=newTreeSet<>(list);System.out.println("去重集:"+set);}}上面程序执行的结果如下:遗憾的是,TreeSet虽然实现起来比较简单,但是它和HashSet有同样的问题,会自动排序,所以不能满足我们的需求。方法六:Stream去重(有序)JDK8给我们带来了一个非常实用的方法Stream,它可以实现很多功能,比如下面的去重功能:publicclassListDistinctExample{publicstaticvoidmain(String[]args){Listlist=newArrayList(){{添加(1);添加(3);添加(5);添加(2);添加(1);添加(3);添加(7);添加(2);}};System.out.println("原始集合:"+list);方法_5(列表);}/***使用Stream去重*@paramlist*/publicstaticvoidmethod_5(Listlist){list=list.stream().distinct().collect(Collectors.toList());System.out.println("去重集合:"+list);}}上面的程序执行结果如下:Stream实现去重功能与其他方法不同的地方在于它不需要创建新的集合,而是利用自身来接收一个去重结果,实现代码也很简洁,并且去重收集的顺序也和原来收集的顺序一致,这是我们去重的重中之重。小结在这篇文章中,我们介绍了集合去重的6种方法,其中实现最简洁,去重后的顺序可以和原始集合保持一致。只有两种方法:LinkedHashSet去重和Stream去重,后面的去重方法不需要使用新的集合,是我们优先考虑的去重方法。判断是非在自己,名誉在别人,得失在人数。博主介绍:一位80后程序员,“坚持”了11年的博客。爱好:阅读、慢跑和羽毛球。我的公众号:Java面试真题解析个人微信:GG_Stone,欢迎关注朋友圈,点赞就好。