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方法性能急劇下降;

    數據量百萬級以上,方法一和方案二耗時接近;

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM