Java中5种List的去重方法及它们的效率对比,你用对了吗?

01、使用两个for循环实现List去重(有序)
/**使用两个for循环实现List去重(有序)
*
* @param list
* */
public static List removeDuplicationBy2For(List<Integer> 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);
}
}
}
return list;
}
02、使用List集合contains方法循环遍历(有序)
/**使用List集合contains方法循环遍历(有序)
*
* @param list
* */
public static List removeDuplicationByContains(List<Integer> list) {
List<Integer> newList =new ArrayList<>();
for (int i=0;i<list.size();i++)
{
boolean isContains =newList.contains(list.get(i));
if(!isContains){
newList.add(list.get(i));
}
}
list.clear();
list.addAll(newList);
return list;
}
03、使用HashSet实现List去重(无序)
/**使用HashSet实现List去重(无序)
*
* @param list
* */
public static List removeDuplicationByHashSet(List<Integer> list) {
HashSet set = new HashSet(list);
//把List集合所有元素清空
list.clear();
//把HashSet对象添加至List集合
list.addAll(set);
return list;
}
04、使用TreeSet实现List去重(有序)
/**使用TreeSet实现List去重(有序)
*
* @param list
* */
public static List removeDuplicationByTreeSet(List<Integer> list) {
TreeSet set = new TreeSet(list);
//把List集合所有元素清空
list.clear();
//把HashSet对象添加至List集合
list.addAll(set);
return list;
}
05、使用java8新特性stream实现List去重(有序)
/**使用java8新特性stream实现List去重(有序)
*
* @param list
* */
public static List removeDuplicationByStream(List<Integer> list) {
List newList = list.stream().distinct().collect(Collectors.toList());
return newList;
}
效率测试代码
public static void main(String args[]) {
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
List<Integer> list3 = new ArrayList<>();
List<Integer> list4 = new ArrayList<>();
List<Integer> list5 = new ArrayList<>();
Random random =new Random();
for (int i = 0; i < 100000; i++) {
int value =random.nextInt(500);
list1.add(value);
list2.add(value);
list3.add(value);
list4.add(value);
list5.add(value);
}
long startTime ;
long endTime;
startTime = System.currentTimeMillis();
removeDuplicationByHashSet(list1);
endTime = System.currentTimeMillis();
System.out.println("使用HashSet实现List去重时间:"+(endTime-startTime)+"毫秒");
startTime = System.currentTimeMillis();
removeDuplicationByTreeSet(list2);
endTime = System.currentTimeMillis();
System.out.println("使用TreeSet实现List去重时间:"+(endTime-startTime)+"毫秒");
startTime = System.currentTimeMillis();
removeDuplicationByStream(list3);
endTime = System.currentTimeMillis();
System.out.println("使用java8新特性stream实现List去重:"+(endTime-startTime)+"毫秒");
startTime = System.currentTimeMillis();
removeDuplicationBy2For(list4);
endTime = System.currentTimeMillis();
System.out.println("使用两个for循环实现List去重:"+(endTime-startTime)+"毫秒");
startTime = System.currentTimeMillis();
removeDuplicationByContains(list5);
endTime = System.currentTimeMillis();
System.out.println("使用List集合contains方法循环遍历:"+(endTime-startTime)+"毫秒");
}
结果:
使用HashSet实现List去重时间:40毫秒
使用TreeSet实现List去重时间:36毫秒
使用java8新特性stream实现List去重:78毫秒
使用两个for循环实现List去重:533毫秒
使用List集合contains方法循环遍历:40毫秒
更多测试结果
随机数在100范围内:
使用HashSet实现List去重时间:32毫秒
使用TreeSet实现List去重时间:40毫秒
使用java8新特性stream实现List去重:128毫秒
使用两个for循环实现List去重:693毫秒
使用List集合contains方法循环遍历:30毫秒
随机数在1000范围内:
使用HashSet实现List去重时间:34毫秒
使用TreeSet实现List去重时间:72毫秒
使用java8新特性stream实现List去重:125毫秒
使用两个for循环实现List去重:1063毫秒
使用List集合contains方法循环遍历:85毫秒
随机数在10000范围内:
使用HashSet实现List去重时间:51毫秒
使用TreeSet实现List去重时间:103毫秒
使用java8新特性stream实现List去重:201毫秒
使用两个for循环实现List去重:5448毫秒
使用List集合contains方法循环遍历:791毫秒
结论
无序HashSet,有序TreeSet
Java 的知识面非常广,面试问的涉及也非常广泛,重点包括:Java 基础、Java 并发,JVM、MySQL、数据结构、算法、Spring、微服务、MQ 等等,涉及的知识点何其庞大,所以我们在复习的时候也往往无从下手,今天小编给大家带来一套 Java 面试题,题库非常全面,包括 Java 基础、Java 集合、JVM、Java 并发、Spring全家桶、Redis、MySQL、Dubbo、Netty、MQ 等等,包含 Java 后端知识点 2000 +
资料获取方式:关注公众号:“程序员白楠楠”获取上述资料
Java中5种List的去重方法及它们的效率对比,你用对了吗?的更多相关文章
- Java中8种常见的排序方法
排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...
- Java中四种遍历List的方法
package com.ietree.basic.collection.loop; import java.util.ArrayList; import java.util.Iterator; imp ...
- JAVA 中两种判断输入的是否是数字的方法__正则化_
JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...
- Java中几种常用数据类型之间转换的方法
Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
- java中获取日期和时间的方法总结
1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下: 要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...
- jsp中四种传递参数的方法
jsp中四种传递参数的方法如下: 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="i ...
- java中四种引用类型
java中四种引用类型 今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在 ...
- java中遍历map对象的多种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...
随机推荐
- redis 各种数据结构的encoding实现
redis 各种数据结构的encoding实现 Redis type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串).hash(哈希).list(列表).set(集合).zs ...
- php生成器 yield 转
一.yield介绍 文档介绍说道:生成器函数的核心是yield关键字.它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给 ...
- vue知识点11
1. Vue.js 是什么 Vue是一套用于构建用户界面的渐进式框架 2. vue的环境搭建(Vue2 ) 3. 经典的hello world new Vue({ ...
- 性能测试之JVM的故障排查-死锁
死锁原因 Java发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.即线程在获得了锁A并且没有释放的情况下去申请锁B,这时,另一个线程已经获得了锁B,在释放锁B之前又要先获得锁A,因此闭环发生,陷入 ...
- 动态规划专题一:线性dp
第一篇博客随笔,被迫写的bushi 上课讲的动态规划入门,还是得总结一下吧 背包 01背包 背包有容量限制,每一件物品只能够取一件(这就是为什么j从V至v[i]循环的原因) 思路:f数组表示当前状态的 ...
- 给定 n 个字符串,求有多少字符串是其他字符串的前缀。
1 #include <cstdio> 2 #include <set> 3 #include <iostream> 4 #include <cstring& ...
- MySQL全面瓦解4:数据定义-DDL
前言 SQL的语言分类主要包含如下几种: DDL 数据定义语言 create.drop.alter 数据定义语言 create.drop.alter 语句 . DML 数据操纵语言 insert.de ...
- CodeForces 1409E Two Platforms
题意 有 \(n\) 个点,分别位于 \((x_i,y_i)\),求最多能用两个长度为 \(k\) 的平台接住多少个点. \(\texttt{Data Range:}n\leq 2\times 10^ ...
- RS485转以太网的概述和应用领域
如今随着物联网技术的不断发展,各种接口更新换代的速度非常的快,RS485转以太网的主要作用就是提供串口转TCP/IP网络接口的功能,它可以将RS232/485/422串口转换成TCP/IP网络接口,实 ...
- JWT原理
1.COOKIE使用和优缺点 https://www.cnblogs.com/xiaonq/p/11094480.html 1.1 cookie原理: 用户名+密码 cookie是保存在用户浏览器 ...