List去重无非几种方法:

下面文章提供的两种:

https://blog.csdn.net/u012156163/article/details/78338574,

以及使用List.stream.distinct()。

文章中还提到了HashSet和linkHashSet,而且测试结果linkHashSet居然比hashSet还快,想了很久感觉linkedHashSet怎么可能快于hashSet,

另外网上也没有针对distinct方法的效率分析,遂自己写了个测试程序测试了下:

数据量1w,碰撞率1/10,hashset基本是1毫秒,linkedHashSet是1-2毫秒,distinct是60毫秒左右

数据量1w,碰撞率1/100,hashset基本是1-2毫秒,linkedHashSet是8-10毫秒,distinct是100毫秒左右

数据量10w时,碰撞率1/10, hashset 23毫秒,linkedHashSet是39毫秒,distinct 68毫秒。

数据量10w时,碰撞率1/100, hashset 6毫秒,linkedHashSet是11毫秒,distinct 53毫秒。

数据量100w时,碰撞率1/10, hashset 242毫秒,linkedHashSet 288毫秒,distinct 230毫秒左右。另外多次测试发现三者不相上下,有多次linkedhashSet快于hashSet

数据量100w时,碰撞率1/100, hashset 36毫秒,linkedHashSet 43毫秒,distinct 82毫秒左右。

特意跑了一下:

数据量100,碰撞率1/10,hashset两种方式均为0毫秒,distinct为60毫秒

发现当碰撞率比较高的时候,数据量大了后使用哪种方法效率都差不多。当碰撞率低的时候,hashset的效果就明显了。

看了下hashset的实现源码,最终也是通过new linkedHashSet(源码居然也是用linkedHashSet而不是hashSet,可能linkedHashSet真的优于纯粹的hashSet?)来实现的,只不过在stream框架下,可能为了可以使用parallelStream进行并发处理,外层套了mapreduce,宏观来看是有冗余操作的,

如果是单纯的去个重的话,其实有点大刀小用的意思。

一句话总结,如果单纯的只是对容器去个重的话,hashSet最快!

Java List去重以及效率分析的更多相关文章

  1. java list去重方式,以及效率问题

    之前面试被问到关于java如何去重的问题,当时没怎么留意,今天刚好项目中用到了,所以记录一下. 实体类: /** * 用户类 */ class User{ private String usernam ...

  2. JDK8 Stream 数据流效率分析

    JDK8 Stream 数据流效率分析 Stream 是Java SE 8类库中新增的关键抽象,它被定义于 java.util.stream (这个包里有若干流类型: Stream<T> ...

  3. JAVA常用数据结构及原理分析

    JAVA常用数据结构及原理分析 http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balaba ...

  4. java fork-join框架应用和分析

    http://shmilyaw-hotmail-com.iteye.com/blog/1897636 java fork-join框架应用和分析 博客分类: concurrency multithre ...

  5. Java的LockSupport.park()实现分析(转载)

    LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: p ...

  6. java list 去重

    Guava ImmutableSet源码去重处理,Hash处理 - 汪小哥 - CSDN博客 https://blog.csdn.net/u012881904/article/details/6895 ...

  7. (6)Java数据结构-- 转:JAVA常用数据结构及原理分析

    JAVA常用数据结构及原理分析  http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balab ...

  8. 细说并发5:Java 阻塞队列源码分析(下)

    上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...

  9. group by与distinct效率分析及优化措施

    如何使用group by进行去重 因为mysql的distinct在结果集中,全部不同,才可以去重.所以,当我们进行去重处理的时候,需要单独对某列进行去重,可以使用group by子句进行分组去重se ...

随机推荐

  1. linux中mysql连接不上,服务启动失败等问题解决

    confluence问题解决方式 1)针对confluence访问页面报500与连接失败等问题 首先我们登陆部署confluence的服器 10.15.4.115 2)重启mysql服务,发现重启失败 ...

  2. 02- TCP/IP 协议族

    TCP/IP概述 TCP/IP协议之间的关系 常用的协议 ping命令 tracert命令 常用协议

  3. Linux 服务管理的两种方式service和systemctl

    service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 ``` # service命令启动redis脚本 service redis start # 直接启动red ...

  4. 【golang】golang中结构体的初始化方法(new方法)

    准备工作: 定义结构体:Student import ( "fmt" "reflect") type Student struct { StudentId st ...

  5. Python中Numpy模块的使用

    目录 NumPy ndarray对象 Numpy数据类型 Numpy数组属性 NumPy NumPy(Numerical Python) 是 Python 的一个扩展程序库,支持大量的维度数组与矩阵运 ...

  6. UVA11991第k次出现的v的下标

    题意:      给你一个有n个数的数字序列,然后有m组询问,每组询问是问第k次出现的v在序列里的小标是多少? 思路:      简单题目,直接开个二维的容器就行了,标记出现次数可以开个数组或者是一维 ...

  7. Linux-鸟菜-1-Linux简介

    Linux-鸟菜-1-Linux简介 鸟哥这一章是介绍了Linux的由来以及建议怎么学Linux.很多也是建议性的东西,概念性的东西(当然我不是排斥概念).把最后鸟哥的汇总粘过来吧. 建议大家去看下这 ...

  8. FreeSql之Expression表达式拼接参数扩展

    在FreeSql源码中Expression表达式拼接默认最多支持到5个泛型参数,当我们使用表关联比较多的时候,就需要进行扩展. 新建一个类,将命名空间改为System.Linq.Expressions ...

  9. .NET Core with 微服务 - 什么是微服务

    微服务是这几年最流行的架构,说起架构不提微服务都不好意思跟人家打招呼.最近想要再梳理一下关于微服务的知识,并且结合本人的一些实践经验来做一些总结与分享.前面会分享一些概念性的东西,后面也会使用.net ...

  10. Docker+Nginx配置SSL

    参考阿里云文档教程 前提条件 购买服务器的服务商开启443端口和服务器已开启443端口(https的默认端口) nginx容器已经安装http_ssl_module模块(启用SSL功能) 下面的教程基 ...