1. import java.util.ArrayList;
  2. import java.util.HashSet;
  3. import java.util.LinkedHashSet;
  4. import java.util.List;
  5. import java.util.TreeSet;
  6.  
  7. /**
  8. * @author 马家立
  9. * @version 创建时间是:2019年8月16日上午9:35:11
  10. * @Description:TODO List去重比较
  11. */
  12. public class listRemoveDuplicate {
  13. /**
  14. * @Title:removeDuplicateByHashSet
  15. * @author:马家立
  16. * @date:2019年9月18日
  17. * @Description:TODO 方式1:HashSet无序去重
  18. * @param <E>
  19. * @param list
  20. * void
  21. */
  22. public static <E> void removeDuplicateByHashSet(List<E> list) {
  23. // 初始化HashSet对象
  24. HashSet<E> set = new HashSet<E>();
  25. List<E> result = new ArrayList<E>();
  26. for (E e : result) {
  27. if (set.add(e)) {
  28. result.add(e);
  29. }
  30. }
  31. // 把List集合所有元素清空
  32. list.clear();
  33. // 把HashSet对象添加至List集合
  34. list.addAll(result);
  35. }
  36.  
  37. /**
  38. * @Title:removeDuplicateByLinkedHashSet
  39. * @author:马家立
  40. * @date:2019年9月18日 @Description:TODO 方式2:LinkedHashSet有序去重
  41. * @param <E>
  42. * @param list
  43. * void
  44. */
  45. public static <E> void removeDuplicateByLinkedHashSet(List<E> list) {
  46. // 初始化LinkedHashSet对象,并把list对象元素赋值给LinkedHashSet对象
  47. LinkedHashSet<E> set = new LinkedHashSet<E>(list);
  48. // 把List集合所有元素清空
  49. list.clear();
  50. // 把LinkedHashSet对象添加至List集合
  51. list.addAll(set);
  52. }
  53.  
  54. /**
  55. * @Title:removeDuplicateByTreeSet
  56. * @author:马家立
  57. * @date:2019年9月18日 @Description:TODO 方式3:TreeSet去重
  58. * @param <E>
  59. * @param list
  60. * void
  61. */
  62. public static <E> void removeDuplicateByTreeSet(List<E> list) {
  63. // 初始化TreeSet对象,并把list对象元素赋值给TreeSet对象
  64. TreeSet<E> treeSet = new TreeSet<E>(list);
  65. // 把List集合所有元素清空
  66. list.clear();
  67. // 把TreeSet对象添加至List集合
  68. list.addAll(treeSet);
  69. }
  70.  
  71. /**
  72. * @Title:removeDuplicateByEquals
  73. * @author:马家立
  74. * @date:2019年9月18日 @Description:TODO 方式4:双重for_iterate循环_equals_remove去重
  75. * @param <E>
  76. * @param list
  77. * void
  78. */
  79. public static <E> void removeDuplicateByEquals(List<E> list) {
  80. for (int i = 0; i < list.size(); i++) {
  81. for (int j = i + 1; j < list.size(); j++) {
  82. if (list.get(i).equals(list.get(j))) {
  83. list.remove(j);
  84. }
  85. }
  86. }
  87. }
  88.  
  89. /**
  90. * @Title:removeDuplicateByContains1
  91. * @author:马家立
  92. * @date:2019年9月18日
  93. * @Description:TODO 方式5:forEach方式循环_contains去重
  94. * @param <E>
  95. * @param list
  96. * void
  97. */
  98. public static <E> void removeDuplicateByContains1(List<E> list) {
  99. List<E> result = new ArrayList<E>();
  100. for (E e : list) {
  101. if (!result.contains(e)) {
  102. result.add(e);
  103. }
  104. }
  105. // 把List集合所有元素清空
  106. list.clear();
  107. // 把所有对象添加至List集合
  108. list.addAll(result);
  109. }
  110.  
  111. /**
  112. * @Title:removeDuplicateByContains2
  113. * @author:马家立
  114. * @date:2019年9月18日 @Description:TODO 方式6:list.stream()方式循环_contains去重
  115. * @param <E>
  116. * @param list
  117. * void
  118. */
  119. public static <E> void removeDuplicateByContains2(List<E> list) {
  120. List<E> result = new ArrayList<E>(list.size());
  121. list.stream().forEach(p -> {
  122. if (!result.contains(p)) {
  123. result.add(p);
  124. }
  125. });
  126. }
  127.  
  128. public static void main(String[] args) {
  129. // 声明List
  130. final List<String> list = new ArrayList<String>();
  131. // List添加数据
  132. for (int i = 0; i < 1000; i++) {
  133. if (0 == (i % 50)) {
  134. list.add("我是皮卡兵");
  135. } else if (0 == (i % 25)) {
  136. list.add("我是皮卡乒");
  137. } else if (0 == (i % 10)) {
  138. list.add("我是皮卡乓");
  139. } else if (0 == (i % 5)) {
  140. list.add("我是皮卡皮");
  141. } else {
  142. list.add("我是第-" + i + "个皮卡丘");
  143. }
  144. list.add("哇咔哇,电光一闪");
  145. }
  146. List<String> list1 = list;
  147. List<String> list2 = list;
  148. List<String> list3 = list;
  149. List<String> list4 = list;
  150. List<String> list5 = list;
  151. List<String> list6 = list;
  152. // 循环次数
  153. int forTimes = 100;
  154. // 纳秒级别
  155. long time = System.nanoTime();
  156.  
  157. // 方式一
  158. for (int i = 0; i < forTimes; i++) {
  159. removeDuplicateByHashSet(list1);
  160. }
  161. long time1 = System.nanoTime();
  162. System.out.println("方式1:HashSet无序去重的时间是:\t" + ((time1 - time)) + "纳秒");
  163.  
  164. // 方式二
  165. for (int i = 0; i < forTimes; i++) {
  166. removeDuplicateByLinkedHashSet(list2);
  167. }
  168. long time2 = System.nanoTime();
  169. System.out.println("方式2:LinkedHashSet有序去重的时间是:\t" + ((time2 - time1)) + "纳秒");
  170.  
  171. // 方式三
  172. for (int i = 0; i < forTimes; i++) {
  173. removeDuplicateByTreeSet(list3);
  174. }
  175. long time3 = System.nanoTime();
  176. System.out.println("方式3:TreeSet去重的时间是:\t" + ((time3 - time2)) + "纳秒");
  177.  
  178. // 方式四
  179. for (int i = 0; i < forTimes; i++) {
  180. removeDuplicateByEquals(list4);
  181. }
  182. long time4 = System.nanoTime();
  183. System.out.println("方式4:双重for_iterate循环_equals_remove去重的时间是:\t" + ((time4 - time3)) + "纳秒");
  184.  
  185. // 方式五
  186. for (int i = 0; i < forTimes; i++) {
  187. removeDuplicateByContains1(list5);
  188. }
  189. long time5 = System.nanoTime();
  190. System.out.println("方式5:forEach方式循环_contains去重的时间是:\t" + ((time5 - time4)) + "纳秒");
  191.  
  192. // 方式六
  193. for (int i = 0; i < forTimes; i++) {
  194. removeDuplicateByContains2(list6);
  195. }
  196. long time6 = System.nanoTime();
  197. System.out.println("方式6:list.stream()方式循环_contains去重的时间是:\t" + ((time6 - time5)) + "纳秒");
  198.  
  199. }
  200. }

结果:

  1. 方式1HashSet无序去重的时间是: 330200纳秒
  2. 方式2LinkedHashSet有序去重的时间是: 660500纳秒
  3. 方式3TreeSet去重的时间是: 758700纳秒
  4. 方式4:双重for_iterate循环_equals_remove去重的时间是: 37300纳秒
  5. 方式5forEach方式循环_contains去重的时间是: 146900纳秒
  6. 方式6list.stream()方式循环_contains去重的时间是: 41510900纳秒

List去重比较的更多相关文章

  1. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  2. 数组去重 JS

    我说的数组去重是这样的: var arr = ['f', 'a',  'b', 'd', 'e', 'g']  ; var str='f'; 去除arr中的str 最简单的是遍历arr与str做比较, ...

  3. [Algorithm] 使用SimHash进行海量文本去重

    在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(L ...

  4. JS去重及字符串奇数位小写转大写

    面试中经常会考到数组的去重.作为一名合格的前端开发者,不知道几种去重方法是在不应该.废话不多说直接开撸-- 一.indexOf()方法 实现思路:使用indexOf()方法来判断新数组中是否有这个值, ...

  5. js数组去重

    这就是数组去重了...var str=['hello','node','element','node','hello','blue','red'];var str1=[]; function firs ...

  6. [Hadoop]-从数据去重认识MapReduce

    这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的Hadoop了.看了官网的教程[吐槽一下,果然英语还是很重要!],嗯啊,一知半解地搭建了本地和伪分布式的, ...

  7. 1.uniq去重命令讲解

    uniq命令: 常见参数: -c,--count *****      在每行旁边显示改行重复出现的次数 -d,--repeated        仅显示重复出现的行,2次或2次以上的行,默认的去重包 ...

  8. python list dict 去重的两种方式

    def dedupe(items, key=None): seen = set() for item in items: val = item if key is None else key(item ...

  9. js给数组去重写法

    数组为 var list =['A','B','A']; 法一:常规做法,新建list,给list添加元素,添加前判断是否包含 var removeRepeatItem = function(list ...

  10. 分享一种容易理解的js去重排序方法

    <script> var arr=[1,8,6,4,88,22,99,4,6,86,5,58,89,5]; //先使用sort()函数去重 var a=arr.sort(function ...

随机推荐

  1. Lua实现简单的类,继承,多态 实例

    -- 类的例子,长方形的类,具备一个打印面积方法和一个设置长宽的方法 --lua实现类的思路,定义出来的对象在lua中可以访问自己有的成员,访问成员函数实际上是通过元表的__index方法实现的,具体 ...

  2. Java工程师学习指南第3部分:Spring与SpringMVC源码解析

    本文整理了微信公众号[Java技术江湖]发表和转载过的Spring全家桶优质文章,想看到更多Java技术文章,就赶紧关注吧. 前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈? ...

  3. UPDATE SELECT OUTPUT

    -- 定义临时表变量,用于 output into 使用 DECLARE @VarOrderStatus table ( OrderNo nvarchar(50) NULL) -- update 表U ...

  4. elasticsearch 映射 dynamic用法

  5. CentOS7 安装mysql(YUM源方式)

    1.下载mysql源安装包 $ wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm   2.安装mysql ...

  6. GitLab中批量更换路径并保留历史记录

    git-change-path.sh #!/bin/bash cat git-name.txt | while read line do echo $line git clone --mirror g ...

  7. [转帖]IIS7配置Gzip压缩

    IIS7配置Gzip压缩 https://www.cnblogs.com/coce/p/6804373.html   II7中自带了gzip功能,理论上应该比ii6配置起来应该简单一点,但是容易出的问 ...

  8. 正式发布! .NET开发控件集ComponentOne 新版本加入Blazor UI

    近期,由葡萄城推出的ComponentOne .NET开发控件集正式发布最新版本! ComponentOne 是一套专注于企业 .NET开发.支持 .NET Core 平台,并完美集成于 Visual ...

  9. oracle索引2

    问什么问题? 索引有什么代价?哪些场景下你需要建索引?或者有时候反过来问,哪些场景下不推荐建索引. 建好索引之后,怎么才能最高效地利用索引?或者反过来问,请说出一个无法有效利用已建索引的案例. 索引的 ...

  10. 用java转换文件的字符集

    中文乱码真的是让人很头疼问题,有了这个方法应该能缓解这种头疼,用的是递归方式查找文件,直接在原文件中修改,小心使用(在本地测试效果有点诡异呀,没有达到预期效果). package com.hy.uti ...