二手房网签合同在哪个网站做,嘉兴网站seo公司,公司怎么申请企业邮箱,什么是网页设计培训1.概述 list集合去重是开发中比较常用的操作#xff0c;在面试中也会经常问到#xff0c;那么list去重都有哪些方式#xff1f;他们之间又该如何选择呢#xff1f; 本文将通过LinkedHashSet、for循环、list流toSet、list流distinct等4种方式分别做1W数据到1000W数据单元测试…1.概述 list集合去重是开发中比较常用的操作在面试中也会经常问到那么list去重都有哪些方式他们之间又该如何选择呢 本文将通过LinkedHashSet、for循环、list流toSet、list流distinct等4种方式分别做1W数据到1000W数据单元测试对比去重效率
2.代码实现 2.1准备工作 构建list集合往里面插入数据在插入几条重复数据用jdk自带的System.currentTimeMillis()做计时器。
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.stream.Collectors;public class Test {public static void main(String[] args) {ListString list1 initList(10000);test(list1);ListString list2 initList(50000);test(list2);ListString list3 initList(100000);test1(list3);ListString list4 initList(500000);test1(list4);ListString list5 initList(1000000);test1(list5);ListString list6 initList(2000000);test1(list6);ListString list7 initList(3000000);test1(list7);ListString list8 initList(5000000);test1(list8);ListString list9 initList(10000000);test1(list9);}public static ListString initList(int num){System.out.println(--------------------------);final ListString list new ArrayList();for (int i 0; i num; i) {list.add(haha- i);}list.add(haha- 1000);list.add(haha- 2000);list.add(haha- 3000);System.out.println(list 初始化完毕 size list.size());return list;}public static void test(ListString list){long startLong System.currentTimeMillis();ListString list1 removeDuplicate(list);System.out.println(去重后集合元素个数 list1.size());long endLong System.currentTimeMillis();System.out.println(LinkedHashSet 测试完毕实际耗时 (endLong-startLong) ,ms);long startLong1 System.currentTimeMillis();ListString list2 removeDuplicate1(list);System.out.println(去重后集合元素个数 list2.size());long endLong1 System.currentTimeMillis();System.out.println(for增强型循环 测试完毕实际耗时 (endLong1-startLong1) ,ms);long startLong2 System.currentTimeMillis();ListString list3 removeDuplicate2(list);System.out.println(去重后集合元素个数 list3.size());long endLong2 System.currentTimeMillis();System.out.println(list流toSet方式 测试完毕实际耗时 (endLong2-startLong2) ,ms);long startLong3 System.currentTimeMillis();ListString list4 removeDuplicate3(list);System.out.println(去重后集合元素个数 list4.size());long endLong3 System.currentTimeMillis();System.out.println(list流distinct方式 测试完毕实际耗时 (endLong3-startLong3) ,ms);System.out.println(--------------------------);}public static void test1(ListString list){long startLong System.currentTimeMillis();ListString list1 removeDuplicate(list);System.out.println(去重后集合元素个数 list1.size());long endLong System.currentTimeMillis();System.out.println(LinkedHashSet 测试完毕实际耗时 (endLong-startLong) ,ms);long startLong2 System.currentTimeMillis();ListString list3 removeDuplicate2(list);System.out.println(去重后集合元素个数 list3.size());long endLong2 System.currentTimeMillis();System.out.println(list流toSet方式 测试完毕实际耗时 (endLong2-startLong2) ,ms);long startLong3 System.currentTimeMillis();ListString list4 removeDuplicate3(list);System.out.println(去重后集合元素个数 list4.size());long endLong3 System.currentTimeMillis();System.out.println(list流distinct方式 测试完毕实际耗时 (endLong3-startLong3) ,ms);System.out.println(--------------------------);}private static ListString removeDuplicate(ListString list) {return new ArrayList(new LinkedHashSet(list));}private static ListString removeDuplicate1(ListString list) {ListString result new ArrayListString(list.size());for (String str : list) {if (!result.contains(str)) {result.add(str);}}return result;}private static ListString removeDuplicate2(ListString list) {return list.stream().collect(Collectors.toSet()).stream().collect(Collectors.toList());}private static ListString removeDuplicate3(ListString list) {return list.stream().distinct().collect(Collectors.toList());}} 2.2输出结果
--------------------------
list 初始化完毕 size 10003
去重后集合元素个数 10000
LinkedHashSet 测试完毕实际耗时7 ,ms
去重后集合元素个数 10000
for增强型循环 测试完毕实际耗时342 ,ms
去重后集合元素个数 10000
list流toSet方式 测试完毕实际耗时89 ,ms
去重后集合元素个数 10000
list流distinct方式 测试完毕实际耗时5 ,ms
--------------------------
--------------------------
list 初始化完毕 size 50003
去重后集合元素个数 50000
LinkedHashSet 测试完毕实际耗时12 ,ms
去重后集合元素个数 50000
for增强型循环 测试完毕实际耗时6059 ,ms
去重后集合元素个数 50000
list流toSet方式 测试完毕实际耗时12 ,ms
去重后集合元素个数 50000
list流distinct方式 测试完毕实际耗时5 ,ms
--------------------------
--------------------------
list 初始化完毕 size 100003
去重后集合元素个数 100000
LinkedHashSet 测试完毕实际耗时14 ,ms
去重后集合元素个数 100000
list流toSet方式 测试完毕实际耗时13 ,ms
去重后集合元素个数 100000
list流distinct方式 测试完毕实际耗时13 ,ms
--------------------------
--------------------------
list 初始化完毕 size 500003
去重后集合元素个数 500000
LinkedHashSet 测试完毕实际耗时101 ,ms
去重后集合元素个数 500000
list流toSet方式 测试完毕实际耗时40 ,ms
去重后集合元素个数 500000
list流distinct方式 测试完毕实际耗时34 ,ms
--------------------------
--------------------------
list 初始化完毕 size 1000003
去重后集合元素个数 1000000
LinkedHashSet 测试完毕实际耗时75 ,ms
去重后集合元素个数 1000000
list流toSet方式 测试完毕实际耗时93 ,ms
去重后集合元素个数 1000000
list流distinct方式 测试完毕实际耗时162 ,ms
--------------------------
--------------------------
list 初始化完毕 size 2000003
去重后集合元素个数 2000000
LinkedHashSet 测试完毕实际耗时140 ,ms
去重后集合元素个数 2000000
list流toSet方式 测试完毕实际耗时2807 ,ms
去重后集合元素个数 2000000
list流distinct方式 测试完毕实际耗时231 ,ms
--------------------------
--------------------------
list 初始化完毕 size 3000003
去重后集合元素个数 3000000
LinkedHashSet 测试完毕实际耗时177 ,ms
去重后集合元素个数 3000000
list流toSet方式 测试完毕实际耗时654 ,ms
去重后集合元素个数 3000000
list流distinct方式 测试完毕实际耗时417 ,ms
--------------------------
--------------------------
list 初始化完毕 size 5000003
去重后集合元素个数 5000000
LinkedHashSet 测试完毕实际耗时307 ,ms
去重后集合元素个数 5000000
list流toSet方式 测试完毕实际耗时6364 ,ms
去重后集合元素个数 5000000
list流distinct方式 测试完毕实际耗时711 ,ms
--------------------------
--------------------------
list 初始化完毕 size 10000003
去重后集合元素个数 10000000
LinkedHashSet 测试完毕实际耗时738 ,ms
去重后集合元素个数 10000000
list流toSet方式 测试完毕实际耗时1790 ,ms
去重后集合元素个数 10000000
list流distinct方式 测试完毕实际耗时1746 ,ms
--------------------------
3.总结 3.1 for循环方式去重谨慎使用 原因有2点1.代码不简洁2.耗时随着数据增大性能显著增高 3.2 LinkedHashSet推荐 LinkedHashSet是jdk自带的所以jdk所有版本都支持使用按照测试结果来说对于方便和性能要求不那么极限的来说无脑使用LinkedHashSet是最方便的的。list流distinct在70w数据以下都会比LinkedHashSet效率高。 3.3 list流toSet不推荐 按照测试结果list流的toSet方式在不同数据量的效率有很大的波动且在任意测试节点都没有LinkedHashSet或者list流distinct效率高所以也不推荐使用。 3.4 list流distinct推荐 list流是jdk8及以上提供的特性在实际场景中去重数据量超过10W基本没有只要jdk支持list流那么使用list流distinct 综上遵循jdk8以下用LinkedHashSetjdk8及以上用list流distinct