本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

Java中List的五种去重方法及效率对比,你都用对了吗?

发布于2020-11-19 20:29     阅读(1415)     评论(0)     点赞(24)     收藏(5)


01、使用两个for循环实现List去重(有序)

/**使用两个for循环实现List去重(有序)
 *
 * @param list
 * */
public static List removeDuplicationBy2For(List<Integer> list) {
    for (int i=0;i<list.size();i++)
    {
        for (int j=i+1;j<list.size();j++)
        {
            if(list.get(i).equals(list.get(j))){
                list.remove(j);
            }
        }
    }
    return list;
}

02、使用List集合contains方法循环遍历(有序)

   /**使用List集合contains方法循环遍历(有序)
     *
     * @param list
     * */
    public static List removeDuplicationByContains(List<Integer> list) {
        List<Integer> newList =new ArrayList<>();
        for (int i=0;i<list.size();i++)
        {
            boolean isContains =newList.contains(list.get(i));
            if(!isContains){
                newList.add(list.get(i));
            }
        }
        list.clear();
        list.addAll(newList);
        return list;
    }

03、使用HashSet实现List去重(无序)

/**使用HashSet实现List去重(无序)
 *
 * @param list
 * */
public static List removeDuplicationByHashSet(List<Integer> list) {
    HashSet set = new HashSet(list);
    //把List集合所有元素清空
    list.clear();
    //把HashSet对象添加至List集合
    list.addAll(set);
    return list;
}

04、使用TreeSet实现List去重(有序)

   /**使用TreeSet实现List去重(有序)
     *
     * @param list
     * */
    public static List removeDuplicationByTreeSet(List<Integer> list) {
        TreeSet set = new TreeSet(list);
        //把List集合所有元素清空
        list.clear();
        //把HashSet对象添加至List集合
        list.addAll(set);
        return list;
    }

05、使用java8新特性stream实现List去重(有序)

/**使用java8新特性stream实现List去重(有序)
 *
 * @param list
 * */
public static List removeDuplicationByStream(List<Integer> list) {
    List newList = list.stream().distinct().collect(Collectors.toList());
    return newList;
}

效率测试代码

public static void main(String args[]) {
    List<Integer> list1 = new ArrayList<>();
    List<Integer> list2 = new ArrayList<>();
    List<Integer> list3 = new ArrayList<>();
    List<Integer> list4 = new ArrayList<>();
    List<Integer> list5 = new ArrayList<>();
    Random random =new Random();
    for (int i = 0; i < 100000; i++) {
        int value =random.nextInt(500);
        list1.add(value);
        list2.add(value);
        list3.add(value);
        list4.add(value);
        list5.add(value);
    }
    long startTime ;
    long endTime;
    startTime = System.currentTimeMillis();
    removeDuplicationByHashSet(list1);
    endTime = System.currentTimeMillis();
    System.out.println("使用HashSet实现List去重时间:"+(endTime-startTime)+"毫秒");
    startTime = System.currentTimeMillis();
    removeDuplicationByTreeSet(list2);
    endTime = System.currentTimeMillis();
    System.out.println("使用TreeSet实现List去重时间:"+(endTime-startTime)+"毫秒");
    startTime = System.currentTimeMillis();
    removeDuplicationByStream(list3);
    endTime = System.currentTimeMillis();
    System.out.println("使用java8新特性stream实现List去重:"+(endTime-startTime)+"毫秒");
    startTime = System.currentTimeMillis();
    removeDuplicationBy2For(list4);
    endTime = System.currentTimeMillis();
    System.out.println("使用两个for循环实现List去重:"+(endTime-startTime)+"毫秒");
    startTime = System.currentTimeMillis();
    removeDuplicationByContains(list5);
    endTime = System.currentTimeMillis();
    System.out.println("使用List集合contains方法循环遍历:"+(endTime-startTime)+"毫秒");
 
}

结果:

  • 使用HashSet实现List去重时间:40毫秒
  • 使用TreeSet实现List去重时间:36毫秒
  • 使用java8新特性stream实现List去重:78毫秒
  • 使用两个for循环实现List去重:533毫秒
  • 使用List集合contains方法循环遍历:40毫秒

更多测试结果

随机数在100范围内:

  • 使用HashSet实现List去重时间:32毫秒
  • 使用TreeSet实现List去重时间:40毫秒
  • 使用java8新特性stream实现List去重:128毫秒
  • 使用两个for循环实现List去重:693毫秒
  • 使用List集合contains方法循环遍历:30毫秒

随机数在1000范围内:

  • 使用HashSet实现List去重时间:34毫秒
  • 使用TreeSet实现List去重时间:72毫秒
  • 使用java8新特性stream实现List去重:125毫秒
  • 使用两个for循环实现List去重:1063毫秒
  • 使用List集合contains方法循环遍历:85毫秒

随机数在10000范围内:

  • 使用HashSet实现List去重时间:51毫秒
  • 使用TreeSet实现List去重时间:103毫秒
  • 使用java8新特性stream实现List去重:201毫秒
  • 使用两个for循环实现List去重:5448毫秒
  • 使用List集合contains方法循环遍历:791毫秒

结论

无序HashSet,有序TreeSet

最后

感谢大家看到这里,文章有不足,欢迎大家指出;如果你觉得写得不错,那就给我一个赞吧。

也欢迎大家关注我的公众号:程序员麦冬,麦冬每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!



所属网站分类: 技术文章 > 博客

作者:java之恋

链接:http://www.javaheidong.com/blog/article/993/a25de64afeeb0cd48255/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

24 0
收藏该文
已收藏

评论内容:(最多支持255个字符)