java List去重方式及效率对比

对List去重并保证添加顺序主要有三种方式:

方式一,利用HashSet不能添加重复数据的特性 由于HashSet不能保证添加顺序,所以只能作为判断条件:

    private static void removeDuplicate(List<String> list) {
        HashSet<String> set = new HashSet<String>(list.size());
        List<String> result = new ArrayList<String>(list.size());
        for (String str : list) {
            if (set.add(str)) {
                result.add(str);
            }
        }
        list.clear();
        list.addAll(result);
    }

方式二,利用LinkedHashSet不能添加重复数据并能保证添加顺序的特性 :

    private static void removeDuplicate2(List<String> list) {
        LinkedHashSet<String> set = new LinkedHashSet<String>(list.size());
        set.addAll(list);
        list.clear();
        list.addAll(set);
    }

方式三,利用List的contains方法循环遍历:

    private static void removeDuplicate3(List<String> list) {
        List<String> result = new ArrayList<String>(list.size());
        for (String str : list) {
            if (!result.contains(str)) {
                result.add(str);
            }
        }
        list.clear();
        list.addAll(result);
    }

测试方法:

    public static void main(String[] args){      

        final List<String> list = new ArrayList<String>();
        for (int i = 0; i < 1000; i++) {
            list.add("haha-" + i);
        }

        long time = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            removeDuplicate(list);
        }
        long time1 = System.currentTimeMillis();
        System.out.println("time1:"+(time1-time));

        for (int i = 0; i < 10000; i++) {
            removeDuplicate2(list);
        }
        long time2 = System.currentTimeMillis();
        System.out.println("time2:"+(time2-time1));

        for (int i = 0; i < 10000; i++) {
            removeDuplicate3(list);
        }
        long time3 = System.currentTimeMillis();
        System.out.println("time3:"+(time3-time2));
      }

测试结果:

time1:451
time2:579
time3:62113

结论:

推荐用方法一或方法二的方式进行去重

原文地址:https://www.cnblogs.com/tc310/p/9304634.html

时间: 2024-10-08 01:41:58

java List去重方式及效率对比的相关文章

List集合去重方式及效率对比

List集合相信大家在开发过程中几乎都会用到.有时候难免会遇到集合里的数据是重复的,需要进行去除.然而,去重方式有好几种方式,你用的是哪种方式呢?去重方式效率是否是最高效.最优的呢?今天就给大家讲解一下List集合去重的常见及常用的四种方式. 01 实现思路:使用两个for循环遍历集合所有元素,然后进行判断是否有相同元素,如果有,则去除.这种方式是大部分最先想到的,也是最简单的实现方式.其中,这种方式可以保证List集合原来的顺序不变. 代码实现: /*** notes:使用两个for循环实现L

java int转String所有方式的效率对比与深入解析

在java中,大家肯定都会遇到int类型转String类型的情形,知其然知其所以然,总结加分析一下,int类型转String类型有以下几种方式: a+"" String.valueOf(a) Integer.toString(a) 以上三种方法在实际使用过程中都是没有问题的,但是效率上还是有些许差别的,所以写个小程序来对比一下他们的效率: int a = 123456789; long start = System.currentTimeMillis(); for (int i=0;

java之去重方式,以及效率问题

之前面试被问到关于java如何去重的问题,当时没怎么留意,今天刚好项目中用到了,所以记录一下. 实体类: /** * 用户类 */ class User{ private String username; private String password; public User(String username, String password) { this.username = username; this.password = password; } public String getUse

java list 去重

Guava ImmutableSet源码去重处理,Hash处理 - 汪小哥 - CSDN博客 https://blog.csdn.net/u012881904/article/details/68954347 Guava Collections使用介绍[超级强大] - kuyuyingzi的专栏 - CSDN博客https://blog.csdn.net/kuyuyingzi/article/details/30529053 Google Guava Collections 使用介绍https:

java StringBuffer,StringBuilder,String自身连接效率对比

当我们仅仅需要a+b 的时候,两个字符串链接任何方法的效率基本一样,都在0.0001毫秒内就可以完成.不过如果需要1万次,10000万次,就会发现string自身的join速度显著下降 package com.java.lang; public class StringTest { int MAX = 10000; //1万次累加 public String Buffer(){ StringBuffer sb = new StringBuffer(); for(int i = 0; i < MA

java int转String全部方式的效率对照与深入解析

在java中,大家肯定都会遇到int类型转String类型的情形,知其然知其所以然.总结加分析一下,int类型转String类型有下面几种方式: a+"" String.valueOf(a) Integer.toString(a) 以上三种方法在实际使用过程中都是没有问题的,可是效率上还是有些许区别的,所以写个小程序来对照一下他们的效率: int a = 123456789; long start = System.currentTimeMillis(); for (int i=0;

Spark入Hbase的四种方式效率对比

一.方式介绍 本次测试一种采用了四种方式进行了对比,分别是:1.在RDD内部调用java API.2.调用saveAsNewAPIHadoopDataset()接口.3.saveAsHadoopDataset().4.BulkLoad方法. 测试使用的大数据版本如下(均为单机版):Hadoop2.7.4.Hbase1.0.2.Spark2.1.0 二.测试(BulkLoad暂未测试) 本次测试采用10W条单一列簇单一字段固定值进行测试. 以下是测试结果: 1.JAVA API 10W条数据:10

java多种文件复制方式以及效率比较

1.背景 java复制文件的方式其实有很多种,可以分为 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream 传统的字符流读写复制FileReader,FileWriter,BufferWriter,BufferedWriter,BufferedReader NIO系列的FileChannel FileChannel+缓冲 java.nio.Files.copy() 第三方包中的Fi

0166 DOM 之 节点操作: 删除节点,删除留言案例,复制(克隆)节点,动态生成表格案例,创建元素的三种方式,innerHTML和createElement效率对比

1.1.1 删除节点 node.removeChild(child) // 此处的node指 父节点 node.removeChild() 方法: 从 node节点中删除一个子节点,返回删除的节点. <button>删除</button> <ul> <li>熊大</li> <li>熊二</li> <li>光头强</li> </ul> <script> // 1.获取元素 va