Java中List几种去重方式的比较

List去重

相信大家在很多需求中遇到过这个问题,将一个List中去除,只保留一份,通常有以下几种办法
我设定一个用例List,里面有10亿数据,都是1,用以下几种方式进行去重,通过计算时间差来对比,当然,计算的方式和比较的方式可能不专业,有疑问大家可以指出来

计算时间差的方法

在核心代码之前加入:
int startTime = System.currentTimeMillis()
在核心代码之后加入:
int endTime = System.currentTimeMillis()
时间差:
time = endTime - startTime

测试用例

List<Integer> list = new ArrayList<>(1000000);
        for (int i = 0; i < 1000000; i++) {
            list.add(1);
        }

我们直接初始化好list的长度,减少对测试的影响

用JDK提供的Set对元素进行去重

Set<Integer> set = new HashSet<>(list);

此种方式是利用了Set的特性:元素不可重复,其底层原理是通过先计算每个对象的hash值,再比较元素值是否相同,如果相同,则保留最新的.
这里写图片描述

用普通方法对List进行去重

 for (int i = 0; i < list.size() - 1; i++) {
            for (int j = list.size() - 1; j > i; j--) {
                if (list.get(j).equals(list.get(i))) {
                    list.remove(j);
                }
            }
        }

此方法的思想是:
两层循环,外层循环从第一个元素想最后一个元素循环,
内层循环是从最后一个元素向外层循环元素的当前元素循环
比较两个元素是否相等,如果相等,移除靠后的元素来进行去重
这种方法时间复杂度大于O(n),小于O(N²)
这里写图片描述

用JDK1.8 Stream中对List进行去重

list.stream().distinct();

首先获得此list的Stream.然后调用distinct()方法,java8中提供流的方式对数据进行处理,非常快,底层用的是forkJoin框架,提供了并行处理,使得多个处理器同时处理流中的数据,所以耗时非常短
这里写图片描述

总结

测试可能不充分,但是,通过用例我们可以清楚的看到,在空间复杂度相同的情况下,用流的方式最快,大家可以在适合的场景选取流的方式对数据进行处理.

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值