List去重比较

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.TreeSet;

/**
 * @author 马家立
 * @version 创建时间是:2019年8月16日上午9:35:11
 * @Description:TODO List去重比较
 */
public class listRemoveDuplicate {
    /**
     * @Title:removeDuplicateByHashSet
     * @author:马家立
     * @date:2019年9月18日
     * @Description:TODO 方式1:HashSet无序去重
     * @param <E>
     * @param list
     *            void
     */
    public static <E> void removeDuplicateByHashSet(List<E> list) {
        // 初始化HashSet对象
        HashSet<E> set = new HashSet<E>();
        List<E> result = new ArrayList<E>();
        for (E e : result) {
            if (set.add(e)) {
                result.add(e);
            }
        }
        // 把List集合所有元素清空
        list.clear();
        // 把HashSet对象添加至List集合
        list.addAll(result);
    }

    /**
     * @Title:removeDuplicateByLinkedHashSet
     * @author:马家立
     * @date:2019年9月18日 @Description:TODO 方式2:LinkedHashSet有序去重
     * @param <E>
     * @param list
     *            void
     */
    public static <E> void removeDuplicateByLinkedHashSet(List<E> list) {
        // 初始化LinkedHashSet对象,并把list对象元素赋值给LinkedHashSet对象
        LinkedHashSet<E> set = new LinkedHashSet<E>(list);
        // 把List集合所有元素清空
        list.clear();
        // 把LinkedHashSet对象添加至List集合
        list.addAll(set);
    }

    /**
     * @Title:removeDuplicateByTreeSet
     * @author:马家立
     * @date:2019年9月18日 @Description:TODO 方式3:TreeSet去重
     * @param <E>
     * @param list
     *            void
     */
    public static <E> void removeDuplicateByTreeSet(List<E> list) {
        // 初始化TreeSet对象,并把list对象元素赋值给TreeSet对象
        TreeSet<E> treeSet = new TreeSet<E>(list);
        // 把List集合所有元素清空
        list.clear();
        // 把TreeSet对象添加至List集合
        list.addAll(treeSet);
    }

    /**
     * @Title:removeDuplicateByEquals
     * @author:马家立
     * @date:2019年9月18日 @Description:TODO 方式4:双重for_iterate循环_equals_remove去重
     * @param <E>
     * @param list
     *            void
     */
    public static <E> void removeDuplicateByEquals(List<E> 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);
                }
            }
        }
    }

    /**
     * @Title:removeDuplicateByContains1
     * @author:马家立
     * @date:2019年9月18日
     * @Description:TODO 方式5:forEach方式循环_contains去重
     * @param <E>
     * @param list
     *            void
     */
    public static <E> void removeDuplicateByContains1(List<E> list) {
        List<E> result = new ArrayList<E>();
        for (E e : list) {
            if (!result.contains(e)) {
                result.add(e);
            }
        }
        // 把List集合所有元素清空
        list.clear();
        // 把所有对象添加至List集合
        list.addAll(result);
    }

    /**
     * @Title:removeDuplicateByContains2
     * @author:马家立
     * @date:2019年9月18日 @Description:TODO 方式6:list.stream()方式循环_contains去重
     * @param <E>
     * @param list
     *            void
     */
    public static <E> void removeDuplicateByContains2(List<E> list) {
        List<E> result = new ArrayList<E>(list.size());
        list.stream().forEach(p -> {
            if (!result.contains(p)) {
                result.add(p);
            }
        });
    }

    public static void main(String[] args) {
        // 声明List
        final List<String> list = new ArrayList<String>();
        // List添加数据
        for (int i = 0; i < 1000; i++) {
            if (0 == (i % 50)) {
                list.add("我是皮卡兵");
            } else if (0 == (i % 25)) {
                list.add("我是皮卡乒");
            } else if (0 == (i % 10)) {
                list.add("我是皮卡乓");
            } else if (0 == (i % 5)) {
                list.add("我是皮卡皮");
            } else {
                list.add("我是第-" + i + "个皮卡丘");
            }
            list.add("哇咔哇,电光一闪");
        }
        List<String> list1 = list;
        List<String> list2 = list;
        List<String> list3 = list;
        List<String> list4 = list;
        List<String> list5 = list;
        List<String> list6 = list;
        // 循环次数
        int forTimes = 100;
        // 纳秒级别
        long time = System.nanoTime();

        // 方式一
        for (int i = 0; i < forTimes; i++) {
            removeDuplicateByHashSet(list1);
        }
        long time1 = System.nanoTime();
        System.out.println("方式1:HashSet无序去重的时间是:	" + ((time1 - time)) + "纳秒");

        // 方式二
        for (int i = 0; i < forTimes; i++) {
            removeDuplicateByLinkedHashSet(list2);
        }
        long time2 = System.nanoTime();
        System.out.println("方式2:LinkedHashSet有序去重的时间是:	" + ((time2 - time1)) + "纳秒");

        // 方式三
        for (int i = 0; i < forTimes; i++) {
            removeDuplicateByTreeSet(list3);
        }
        long time3 = System.nanoTime();
        System.out.println("方式3:TreeSet去重的时间是:	" + ((time3 - time2)) + "纳秒");

        // 方式四
        for (int i = 0; i < forTimes; i++) {
            removeDuplicateByEquals(list4);
        }
        long time4 = System.nanoTime();
        System.out.println("方式4:双重for_iterate循环_equals_remove去重的时间是:	" + ((time4 - time3)) + "纳秒");

        // 方式五
        for (int i = 0; i < forTimes; i++) {
            removeDuplicateByContains1(list5);
        }
        long time5 = System.nanoTime();
        System.out.println("方式5:forEach方式循环_contains去重的时间是:	" + ((time5 - time4)) + "纳秒");

        // 方式六
        for (int i = 0; i < forTimes; i++) {
            removeDuplicateByContains2(list6);
        }
        long time6 = System.nanoTime();
        System.out.println("方式6:list.stream()方式循环_contains去重的时间是:	" + ((time6 - time5)) + "纳秒");
        
    }
}

结果:

方式1:HashSet无序去重的时间是:    330200纳秒
方式2:LinkedHashSet有序去重的时间是:    660500纳秒
方式3:TreeSet去重的时间是:    758700纳秒
方式4:双重for_iterate循环_equals_remove去重的时间是:    37300纳秒
方式5:forEach方式循环_contains去重的时间是:    146900纳秒
方式6:list.stream()方式循环_contains去重的时间是:    41510900纳秒
原文地址:https://www.cnblogs.com/mjtabu/p/11543212.html