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

实体类:

/**
* 用户类
*/
class User{
private String username;
private String password; public User(String username, String password) {
this.username = username;
this.password = password;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

测试类:

 public static void main(String[] args) {

        ArrayList<User> arrayList = new ArrayList<>();
long currentTimeMillis = System.currentTimeMillis();
int f = 100000;
for(int i = 0; i < f; i++){
arrayList.add(new User(""+i, "7878"));
}
Iterator<User> iterator = arrayList.iterator();
Set<String> hashSet = new HashSet<>();
LinkedList<User> newList = new LinkedList<>(); // 第一种:set集合去重,不改变原有的顺序,根据username唯一标识去重
while (iterator.hasNext()){
User u = iterator.next();
// 根据set不能存放相同值的特性
if(!StringUtils.isEmpty(u.getUsername())){
if (hashSet.add(u.getUsername())){
// 将其重新放入在LinkedList中
newList.add(u);
}
}
}
long currentTimeMillis1_1 = System.currentTimeMillis();
System.out.println("第一种set集合去重,不改变原有的顺序:"+(currentTimeMillis1_1 - currentTimeMillis)); // 第二种:遍历后判断赋给另一个list集合,利用List的contains方法循环遍历
List<User> listNew=new ArrayList<>();
for (User str:arrayList) {
if(!listNew.contains(str)){
listNew.add(str);
}
}
long currentTimeMillis1_2 = System.currentTimeMillis();
System.out.println("第二种:遍历后判断赋给另一个list集合,利用List的contains方法循环遍历:"+(currentTimeMillis1_2 - currentTimeMillis1_1)); // 第三种:set去重
Set set = new HashSet();
List<String> listNew2=new ArrayList<>();
set.addAll(arrayList);
listNew2.addAll(set); long currentTimeMillis1_3 = System.currentTimeMillis();
System.out.println(" 第三种:set去重"+(currentTimeMillis1_3 - currentTimeMillis1_2)); // 第四种:set去重(缩减为一行)
List<String> listNew3=new ArrayList<>(new HashSet(arrayList)); long currentTimeMillis1_4 = System.currentTimeMillis();
System.out.println("第四种:set去重(缩减为一行)"+(currentTimeMillis1_4 - currentTimeMillis1_3)); // 第五种:去重并按自然顺序排序
/* TreeSet treeSet = new TreeSet(arrayList);
List tempList = new ArrayList();
tempList.addAll(treeSet);
//List<User> listNew4=new ArrayList<>(new TreeSet<User>(arrayList)); long currentTimeMillis1_5 = System.currentTimeMillis();
System.out.println(currentTimeMillis1_5 - currentTimeMillis1_4);*/ // 第六种:双重for循环,去重
for(int i = 0 ; i < arrayList.size() - 1; i ++){
for(int j = arrayList.size() - 1; j > i; j --){
if(arrayList.get(j).equals(arrayList.get(i))){
arrayList.remove(j);
}
}
}
long currentTimeMillis1_6 = System.currentTimeMillis();
System.out.println("第六种:双重for循环,去重"+(currentTimeMillis1_6 - currentTimeMillis1_4)); // 第七种:利用HashSet不能添加重复数据的特性 由于HashSet不能保证添加顺序,所以只能作为判断条件
HashSet<User> set2 = new HashSet<>(arrayList.size());
List<User> result = new ArrayList<>(arrayList.size());
for (User str3 : arrayList) {
if (set2.add(str3)) {
result.add(str3);
}
}
arrayList.clear();
arrayList.addAll(result);
long currentTimeMillis1_7 = System.currentTimeMillis();
System.out.println("第七种:利用HashSet不能添加重复数据的特性 由于HashSet不能保证添加顺序,所以只能作为判断条件"+(currentTimeMillis1_7 - currentTimeMillis1_6)); // 第八种:利用LinkedHashSet不能添加重复数据并能保证添加顺序的特性
LinkedHashSet<User> set5 = new LinkedHashSet<>(arrayList.size());
set5.addAll(arrayList);
arrayList.clear();
arrayList.addAll(set5); long currentTimeMillis1_8 = System.currentTimeMillis();
System.out.println("第八种:利用LinkedHashSet不能添加重复数据并能保证添加顺序的特性"+(currentTimeMillis1_8 - currentTimeMillis1_7)); }

控制台输出:

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

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

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. 洛谷 P1169 棋盘制作 题解

    题面 这道题可以分成两部分来处理: 第一部分: 设f[i][j]表示右下角以(i,j)结尾的最大正方形的边长. 显然f[i][j]=min(f[i][j-1],f[i-1][j-1],f[i-1][j ...

  2. svn下载项目的时候出现 Path to certificate

    svn关联的时候出现这种情况,并且有svn的账号的时候,可以找setting中Version Control 中的Subversion中celar 一下即可,然后再重新下载就会让你重新输入用户名和密码 ...

  3. Select 和Alert

    Select 和Alert使用前都必须先导入 from selenium.webdriver.common.alert import Alert from selenium.webdriver.sup ...

  4. RabbitMQ入门教程(三):Hello World

    原文:RabbitMQ入门教程(三):Hello World 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...

  5. centos 安装配置LAMP平台

    实验环境: [root@nmserver-7 html]# cat /etc/redhat-release CentOS release 7.3.1611 (AltArch) [root@nmserv ...

  6. ORA-00979: 不是 GROUP BY 表达式

    在oracle数据库中,sql语句中group by子句报错,原因是select 存在列字段,而group by中不存在.

  7. atxserver2-rethinkdb的一些基础操作

    因为我只需要一些基础操作就好,所以在web端的 Data Explorer 操作,首先启动  rethinkdb.exe,然后登陆网页端, 下面是一些基础操作的语句, 一.创建表r.db(‘atxse ...

  8. 【leetcode】 463. Island Perimeter

    题目: 以二维数组形式表示坐标岛屿,求边长. 例子: [[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]] Answer: 16 Explanation: The ...

  9. 2019-11-29-VisualStudio-使用新项目格式快速打出-Nuget-包

    title author date CreateTime categories VisualStudio 使用新项目格式快速打出 Nuget 包 lindexi 2019-11-29 10:15:25 ...

  10. 2019-2020-1 20199319《Linux内核原理与分析》第二周作业

    计算机是如何工作的 反汇编一个简单的C程序 1.在实验环境下,创建main.c,并进入该文件进行代码的编写 在VIM文本编辑器中编写完代码后按"Shift"+":&quo ...