List去除重复数据(保留顺序)的两种简便方式

本文记录了Java中ArrayList去重的两种方法。一是使用LinkedHashSet,可删除重复数据并保持顺序;二是利用Java 8新特性Stream的distinct()方法。从代码看,Stream方法更简洁,但测试显示其耗时是前者十几倍,内存充足时建议用前者。

偶然看到了一些比较有意思的文章,记录一下:

1.使用LinkedHashSet删除arraylist中的重复数据

LinkedHashSet是在一个ArrayList删除重复数据的最佳方法。LinkedHashSet在内部完成两件事:

  • 删除重复数据

  • 保持添加到其中的数据的顺序

Java示例使用LinkedHashSet删除arraylist中的重复项。在给定的示例中,numbersList是包含整数的arraylist,其中一些是重复的数字。

例如1,3和5.我们将列表添加到LinkedHashSet,然后将内容返回到列表中。结果arraylist没有重复的整数。

    @Test
    public void testLinkedHashSet(){
        List<Integer> numberList = new ArrayList<>(Arrays.asList(2, 1, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7));
        System.out.println(numberList);
        LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>(numberList);
        ArrayList<Integer> withoutDuplicateList = new ArrayList<>(linkedHashSet);
        System.out.println(withoutDuplicateList);
    }

 

2.使用java8新特性stream进行List去重

要从arraylist中删除重复项,我们也可以使用java 8 stream api。使用steam的distinct()方法返回一个由不同数据组成的流,通过对象的equals()方法进行比较。

收集所有区域数据List使用Collectors.toList()。

Java程序,用于在不使用Set的情况下从java中的arraylist中删除重复项。

    @Test
    public void testStream(){
        List<Integer> numberList = new ArrayList<>(Arrays.asList(2, 1, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7));
        System.out.println(numberList);
        List<Integer> distinctList = numberList.stream().distinct().collect(Collectors.toList());
        System.out.println(distinctList);
    }

总结:单从代码来看使用LinkedHashSet的代码相对多一点,这个主要是因为stream的流式方法看上去更简洁,但是测试结果显示第二种耗时是第一种的十几倍,从代码也能大致看到,第一种类似空间换时间的策略,在内存不是那么缺的时候建议还是使用第一种。

原文见:https://mp.weixin.qq.com/s?__biz=MzAxNjk4ODE4OQ==&mid=2247495026&idx=2&sn=9a63afc82ac41525d903eadb005ac699&chksm=9beecc00ac994516e58e23ddd80f44df188ecf8d3c970bf349f157572a64a7d6efe2c1a50bd2&mpshare=1&scene=1&srcid=1119SH0KjtyOCsyVROvB1S2Q&sharer_sharetime=1605752871732&sharer_shareid=43ff4c7fee7f245bbb910e1f473a5785&key=6b64641f420daf84b0065a0da10e4fc3a99b99733c7a93c0f5c41600a943a1334b6b6c4d6193deb2243baf408cb61e0076ce030fba37d6d85673b3192cd8fe5b0ce7393742fb4dd55c66ab7ad994e05bbc24461ed846b8bf4b7ad9a26b3ea333689294ec62198547f38b762dd487e78a8a95a6e4f683ab17e370e87f5a91ddaa&ascene=1&uin=Mjc1OTAyODQzNQ%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&exportkey=AX7UCRd4K8DDHzO7HPKVtQ8%3D&pass_ticket=jPHWj5%2FCmOfXVO0arJnMeqwgI5TQ2fx298Mffdtbim5LBIV32kQ1Sp1Itc2FsUSL&wx_header=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值