List对象得到多个属性List并去重方案比较

1、构造list:

        List<HyperLink> list = new ArrayList<>();
        for (int i = 0; i < 1600000; i++) {
            HyperLink hyperLink = new HyperLink();
            hyperLink.setName("name" + i);
            hyperLink.setUrl("url" + i);
            list.add(hyperLink);
        }

 

2、不同方案耗时比较:

方案一:

        //方案一:java8 stream() + distinct()
        Long time1 = System.currentTimeMillis();
        List<String> dorgCodes = list.stream().map(o->o.getName()).distinct().collect(Collectors.toList());
        List<String> dgoodsCodes = list.stream().map(o->o.getUrl()).distinct().collect(Collectors.toList());
        Long time2 = System.currentTimeMillis();
        System.out.println("time2 - time1:" + (time2 - time1));

方案二:

        //方案二:Set 集合去重
        Long time3 = System.currentTimeMillis();
        Set<String> orgSets = new HashSet<>();
        Set<String> goodsSets = new HashSet<>();
        list.forEach(o ->{
            orgSets.add(o.getName());
            goodsSets.add(o.getUrl());
        });
        List<String> orgCodes = new ArrayList<>(orgSets);
        List<String> goodsCodes = new ArrayList<>(goodsSets);
        System.out.println("time3:" + (System.currentTimeMillis() - time3));

方案三:

        //方案三:List.contains()去重
        Long time3 = System.currentTimeMillis();
        List<String> orgCodes = new ArrayList<>();
        List<String> goodsCodes = new ArrayList<>();
        list.forEach(o ->{
            if(!orgCodes.contains(o.getName())){
                orgCodes.add(o.getName());
            }
            if(!goodsCodes.contains(o.getUrl())){
                goodsCodes.add(o.getUrl());
            }
        });
        System.out.println("time3:" + (System.currentTimeMillis() - time3));

 

结论: list的数据量是钱以下级别时,方案二和方案三较快;

    数据量是十万级别以上,方案二中List的contains方法性能急剧下降;

    数据量百万级以上,方法一和方案二耗时接近;

    故方案二是目前的最佳方案;

 

转载于:https://www.cnblogs.com/aibaiyang/p/11578353.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值