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无序去重的时间是:\t" + ((time1 - time)) + "纳秒"); // 方式二
for (int i = 0; i < forTimes; i++) {
removeDuplicateByLinkedHashSet(list2);
}
long time2 = System.nanoTime();
System.out.println("方式2:LinkedHashSet有序去重的时间是:\t" + ((time2 - time1)) + "纳秒"); // 方式三
for (int i = 0; i < forTimes; i++) {
removeDuplicateByTreeSet(list3);
}
long time3 = System.nanoTime();
System.out.println("方式3:TreeSet去重的时间是:\t" + ((time3 - time2)) + "纳秒"); // 方式四
for (int i = 0; i < forTimes; i++) {
removeDuplicateByEquals(list4);
}
long time4 = System.nanoTime();
System.out.println("方式4:双重for_iterate循环_equals_remove去重的时间是:\t" + ((time4 - time3)) + "纳秒"); // 方式五
for (int i = 0; i < forTimes; i++) {
removeDuplicateByContains1(list5);
}
long time5 = System.nanoTime();
System.out.println("方式5:forEach方式循环_contains去重的时间是:\t" + ((time5 - time4)) + "纳秒"); // 方式六
for (int i = 0; i < forTimes; i++) {
removeDuplicateByContains2(list6);
}
long time6 = System.nanoTime();
System.out.println("方式6:list.stream()方式循环_contains去重的时间是:\t" + ((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纳秒

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. django 之(四) --- 级联|截流

    登陆注册 登陆注册实现 settings.py # redis配置 CACHES = { "default": { "BACKEND": "djang ...

  2. 【VS开发】VC下加载JPG/GIF/PNG图片的两种方法

    1.用API OleLoadPicture来加载JPG.GIF格式的图片(注:不支持PNG格式,另外GIF只能加载第一帧,且不支持透明) OleLoadPicture 函数实际上创建了一个IPictu ...

  3. 最新 欢聚时代java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.欢聚时代等10家互联网公司的校招Offer,因为某些自身原因最终选择了欢聚时代.6.7月主要是做系统复习.项目复盘.Leet ...

  4. [转帖]「知乎知识库」— 5G

    「知乎知识库」— 5G 甜草莓 https://zhuanlan.zhihu.com/p/55998832 ​ 通信 话题的优秀回答者 已关注 881 人赞同了该文章 谢 知识库 邀请~本文章是几个答 ...

  5. SQLite进阶-15.触发器

    目录 触发器(Trigger) 触发器(Trigger)的要点: 触发器应用 查看触发器 删除触发器 触发器(Trigger) 触发器(Trigger)是数据库的回调函数,它会在指定的数据库事件发生时 ...

  6. mysql 查询最佳实践

    (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好习惯 (2)前导模糊查询不 ...

  7. 关于greenlet的一些问题

    今天测试关于协程方面的代码发现我安装了greenlet模块缺导入不进.如图: 后来找了半天才发现原来greenlet被整进了gevent包中,如下导入就可以成功: 但这个greenlet没有了swit ...

  8. 社工工具包 SEToolkit

    社会工程学(Social Engineering)简称社工,其通过分析攻击对象的心理弱点,利用人性的本能反应,以及任何好奇心,贪婪等心理特征进行的,使用诸如假冒,欺骗,引诱等多种手段来达成攻击目标的一 ...

  9. 工作单元 — Unit Of Work

    在进行数据库添加.修改.删除时,为了保证事务的一致性,即操作要么全部成功,要么全部失败.例如银行A.B两个账户的转账业务.一方失败都会导致事务的不完整性,从而事务回滚.而工作单元模式可以跟踪事务,在操 ...

  10. 搞懂String、StringBuffer、StringBuilder的区别

    String.StringBuffer.StringBuilder有什么区别呢? 1.String: 首先String是不可变的这是家喻户晓的,它的底层是用一个final修饰的char数组来保存数据的 ...