之前面试被问到关于java如何去重的问题,当时没怎么留意,今天刚好项目中用到了,所以记录一下。

实体类:

  1. /**
  2. * 用户类
  3. */
  4. class User{
  5. private String username;
  6. private String password;
  7.  
  8. public User(String username, String password) {
  9. this.username = username;
  10. this.password = password;
  11. }
  12.  
  13. public String getUsername() {
  14. return username;
  15. }
  16.  
  17. public void setUsername(String username) {
  18. this.username = username;
  19. }
  20.  
  21. public String getPassword() {
  22. return password;
  23. }
  24.  
  25. public void setPassword(String password) {
  26. this.password = password;
  27. }
  28. }

测试类:

  1. public static void main(String[] args) {
  2.  
  3. ArrayList<User> arrayList = new ArrayList<>();
  4. long currentTimeMillis = System.currentTimeMillis();
  5. int f = 100000;
  6. for(int i = 0; i < f; i++){
  7. arrayList.add(new User(""+i, "7878"));
  8. }
  9. Iterator<User> iterator = arrayList.iterator();
  10. Set<String> hashSet = new HashSet<>();
  11. LinkedList<User> newList = new LinkedList<>();
  12.  
  13. // 第一种:set集合去重,不改变原有的顺序,根据username唯一标识去重
  14. while (iterator.hasNext()){
  15. User u = iterator.next();
  16. // 根据set不能存放相同值的特性
  17. if(!StringUtils.isEmpty(u.getUsername())){
  18. if (hashSet.add(u.getUsername())){
  19. // 将其重新放入在LinkedList中
  20. newList.add(u);
  21. }
  22. }
  23. }
  24. long currentTimeMillis1_1 = System.currentTimeMillis();
  25. System.out.println("第一种set集合去重,不改变原有的顺序:"+(currentTimeMillis1_1 - currentTimeMillis));
  26.  
  27. // 第二种:遍历后判断赋给另一个list集合,利用List的contains方法循环遍历
  28. List<User> listNew=new ArrayList<>();
  29. for (User str:arrayList) {
  30. if(!listNew.contains(str)){
  31. listNew.add(str);
  32. }
  33. }
  34. long currentTimeMillis1_2 = System.currentTimeMillis();
  35. System.out.println("第二种:遍历后判断赋给另一个list集合,利用List的contains方法循环遍历:"+(currentTimeMillis1_2 - currentTimeMillis1_1));
  36.  
  37. // 第三种:set去重
  38. Set set = new HashSet();
  39. List<String> listNew2=new ArrayList<>();
  40. set.addAll(arrayList);
  41. listNew2.addAll(set);
  42.  
  43. long currentTimeMillis1_3 = System.currentTimeMillis();
  44. System.out.println(" 第三种:set去重"+(currentTimeMillis1_3 - currentTimeMillis1_2));
  45.  
  46. // 第四种:set去重(缩减为一行)
  47. List<String> listNew3=new ArrayList<>(new HashSet(arrayList));
  48.  
  49. long currentTimeMillis1_4 = System.currentTimeMillis();
  50. System.out.println("第四种:set去重(缩减为一行)"+(currentTimeMillis1_4 - currentTimeMillis1_3));
  51.  
  52. // 第五种:去重并按自然顺序排序
  53. /* TreeSet treeSet = new TreeSet(arrayList);
  54. List tempList = new ArrayList();
  55. tempList.addAll(treeSet);
  56. //List<User> listNew4=new ArrayList<>(new TreeSet<User>(arrayList));
  57.  
  58. long currentTimeMillis1_5 = System.currentTimeMillis();
  59. System.out.println(currentTimeMillis1_5 - currentTimeMillis1_4);*/
  60.  
  61. // 第六种:双重for循环,去重
  62. for(int i = 0 ; i < arrayList.size() - 1; i ++){
  63. for(int j = arrayList.size() - 1; j > i; j --){
  64. if(arrayList.get(j).equals(arrayList.get(i))){
  65. arrayList.remove(j);
  66. }
  67. }
  68. }
  69. long currentTimeMillis1_6 = System.currentTimeMillis();
  70. System.out.println("第六种:双重for循环,去重"+(currentTimeMillis1_6 - currentTimeMillis1_4));
  71.  
  72. // 第七种:利用HashSet不能添加重复数据的特性 由于HashSet不能保证添加顺序,所以只能作为判断条件
  73. HashSet<User> set2 = new HashSet<>(arrayList.size());
  74. List<User> result = new ArrayList<>(arrayList.size());
  75. for (User str3 : arrayList) {
  76. if (set2.add(str3)) {
  77. result.add(str3);
  78. }
  79. }
  80. arrayList.clear();
  81. arrayList.addAll(result);
  82. long currentTimeMillis1_7 = System.currentTimeMillis();
  83. System.out.println("第七种:利用HashSet不能添加重复数据的特性 由于HashSet不能保证添加顺序,所以只能作为判断条件"+(currentTimeMillis1_7 - currentTimeMillis1_6));
  84.  
  85. // 第八种:利用LinkedHashSet不能添加重复数据并能保证添加顺序的特性
  86. LinkedHashSet<User> set5 = new LinkedHashSet<>(arrayList.size());
  87. set5.addAll(arrayList);
  88. arrayList.clear();
  89. arrayList.addAll(set5);
  90.  
  91. long currentTimeMillis1_8 = System.currentTimeMillis();
  92. System.out.println("第八种:利用LinkedHashSet不能添加重复数据并能保证添加顺序的特性"+(currentTimeMillis1_8 - currentTimeMillis1_7));
  93.  
  94. }

控制台输出:

提示:在数据量大的情况下,最好不要使用第二种和第六种,速度太慢了

至于效率问题大家自己根据实际情况选择吧。

java list去重方式,以及效率问题的更多相关文章

  1. java List 去重方式及效率对比

    01 实现思路:使用两个for循环遍历集合所有元素,然后进行判断是否有相同元素,如果有,则去除.这种方式是大部分最先想到的,也是最简单的实现方式.其中,这种方式可以保证List集合原来的顺序不变. 代 ...

  2. java List去重方式及效率对比

    对List去重并保证添加顺序主要有三种方式: 方式一,利用HashSet不能添加重复数据的特性 由于HashSet不能保证添加顺序,所以只能作为判断条件: private static void re ...

  3. List集合去重方式及效率对比

    List集合相信大家在开发过程中几乎都会用到.有时候难免会遇到集合里的数据是重复的,需要进行去除.然而,去重方式有好几种方式,你用的是哪种方式呢?去重方式效率是否是最高效.最优的呢?今天就给大家讲解一 ...

  4. java map遍历方式及效率

    本文转载自Java Map遍历方式的选择. 只给出遍历方式及结论.测试数据可以去原文看. 如果你使用HashMap 同时遍历key和value时,keySet与entrySet方法的性能差异取决于ke ...

  5. java list 去重

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

  6. java list去重操作实现方式

    Java中的List是可以包含重复元素的(hash code 和equals),接下来将介绍两种方式实现java list去重操作,感兴趣的朋友可以参考下   Java中的List是可以包含重复元素的 ...

  7. java中多种写文件方式的效率对比实验

    一.实验背景 最近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出.字符流输出.内存文件映射输出.前两种又可以分为 ...

  8. java int转String全部方式的效率对照与深入解析

    在java中,大家肯定都会遇到int类型转String类型的情形,知其然知其所以然.总结加分析一下,int类型转String类型有下面几种方式: a+"" String.value ...

  9. java多种文件复制方式以及效率比较

    1.背景 java复制文件的方式其实有很多种,可以分为 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedO ...

随机推荐

  1. oracle登录后无法使用,显示Connected to an idle instance

    1.登录情况: [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Mon Jul ...

  2. 头大!RabbitMQ 和 Kafka 到底怎么选?

    前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措. 对于RabbitMQ和Kafka,到底应该选哪个? Rabb ...

  3. 洛谷 P2023 维护序列 题解

    题面 注意一个细节,查询和更新都需要pushdown(); #include <bits/stdc++.h> #define int long long using namespace s ...

  4. mysql小数和类型转换函数

    保留两位小数 SELECT ROUND( 123456789.3563898,2),TRUNCATE(123456789.3563898,2),FORMAT(123456789.3563898,2); ...

  5. springboot中的编码设置

    在springboot中编码配置可以通过filter也可以通过springboot的核心配置文件application.properties中配置如下信息: #配置字符编码spring.http.en ...

  6. mysql远程连接错误10038--navicat for mysql (10038)

    1.确定3306端口是否对外开放 如果是阿里云服务器,需要添加安全组规则 2.授权 执行sql,账号密码按照自己服务器而定 grant all privileges on *.* to 'root'@ ...

  7. jQuery改变元素class属性

    //去掉class属性 $(this).parent('li').removeClass("prev_selected"); //去掉同兄弟的class属性. $(this).pa ...

  8. 微软撤出 Windows断供华为!

    华为被美国列入“实体名单”后,从硬件到软件再到技术标准,华为对外联系纷纷被掐断,其中软件系统方面,Google安卓系统已经停止与华为合作,Mate 20 Pro也被从安卓Q 10.0的尝鲜名单中移除. ...

  9. apache 修改文件上传大小限制

    Windows 环境下的修改方法 ================================================================ 第一步:修改在php5下POST文件 ...

  10. C++ STL(一)string的用法

    # 1.string的用法- string在<iostream>的头中就有,但是还是得用<string>的头 ##### 构造函数- str(const char* ch) 直 ...