Java中List集合去重方法以及效率对比

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

01

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

代码实现:

/**
* notes:使用两个for循环实现List去重
* @param list
* @return
*/
public static List repeatListWayOne(List<String> 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

实现思路:我们知道HashSet实现了Set接口,不允许出现重复元素。可以基于这个想法,把List集合所有元素存入HashSet对象,接着把List集合元素全部清空,最后把HashSet对象元素全部添加至List集合中,这样就可以保证不出现重复元素。而HashSet有一个构造函数,在初始化时可以直接添加元素。其中,HashSet不能保证顺序不变,所以此方式不能保证List集合原来的顺序不变。

代码实现:

/**
* notes:使用HashSet实现List去重
* @param list
* @return
*/
public static List repeatListWayTwo(List<String> list){
 //初始化HashSet对象,并把list对象元素赋值给HashSet对象
 HashSet set = new HashSet(list);
 //把List集合所有元素清空
 list.clear();
 //把HashSet对象添加至List集合
 list.addAll(set);
 return list;
}

03

实现思路:TreeSet集合也是实现Set接口,是一个有序的,并且无重复元素集合。同理,我们可以根据上面方式二的思想进行去重。其中,去重后的List集合可以保证和原来的顺序一致。

代码实现:

/**
* notes:使用TreeSet实现List去重
* @param list
* @return
*/
public static List repeatListWayThird(List<String> list){
 //初始化TreeSet对象,并把list对象元素赋值给TreeSet对象
 TreeSet set = new TreeSet(list);
 //把List集合所有元素清空
 list.clear();
 //把TreeSet对象添加至List集合
 list.addAll(set);
 return list;
}

04

实现思路:利用List集合contains方法循环遍历,先创建新的List集合,接着循环遍历原来的List集合,判断新集合是否包含有旧集合,如果有,则不添加至新集合,否则添加。最后,把旧集合清空,把新集合元素赋值给旧集合。

代码实现:

/**
* notes:利用List集合contains方法循环遍历去重
* @param list
* @return
*/
public static List repeatListWayFourth(List<String> list){
  //新建新List集合,用于存放去重后的元素
  List<String> newList = new ArrayList<String>();
  //循环遍历旧集合元素
  for(int i = 0; i < list.size(); i++ ){
    //判断新集合是否包含有,如果不包含有,则存入新集合中
    boolean isContains = newList.contains(list.get(i));
    if(!isContains){
      newList.add(list.get(i));
    }
  }
  //把List集合所有元素清空
  list.clear();
  //把新集合元素添加至List集合
  list.addAll(newList);
  return list;
}

上面给大家介绍了四种List集合去重方式。那么,哪种方式效率是最好的呢?下面就演示一下进行对比。

为了演示方式,随机生成0-500之间的20000个整数字符串,并存入List集合,并在相应代码打印相关时间进行对比。其中,随机生成List集合代码如下:

/**
* 随机生成0-500之间的20000个整数字符串,并存入List集合
* @return
*/
public static List<String> getRandomList(){
  List<String> list = new ArrayList<String>();
  //随机生成20000个整数字符串
  for(int i = 1; i <= 20000; i++){
    //任意取[0,500)之间整数,其中0可以取到,500取不到
    int number = new Random().nextInt(500);
    String number_str = "geshan"+number;
    list.add(number_str);
  }
  return list;
}

为了保证List集合元素一致,创建四个List集合,分别对应List去重方式。效率对比代码如下:

public static void main(String[] args){
  //随机生成0-500之间的1000个整数字符串List集合
  List<String> list = getRandomList();

  //为了演示四种方式效率,创建四个List集合,保证List集合元素一致
  //方式一List集合
  List<String> oneList = new ArrayList<>();
  oneList.addAll(list);
  //方式二List集合
  List<String> twoList = new ArrayList<>();
  twoList.addAll(list);
  //方式三List集合
  List<String> thirdList = new ArrayList<>();
  thirdList.addAll(list);
  //方式四List集合
  List<String> fourthList = new ArrayList<>();
  fourthList.addAll(list);

  System.out.println("方式一:使用两个for循环实现List去重");
  System.out.println("原来集合大小:"+oneList.size()+",集合元素>>"+oneList);
  Date oneDateBegin = new Date();
  repeatListWayOne(oneList);
  System.out.println("集合去重大小:"+oneList.size()+",集合元素>>"+oneList);
  Date oneDateEnd = new Date();
  System.out.println("去重所需时间:"+(oneDateEnd.getTime()-oneDateBegin.getTime())+"毫秒");

  System.out.println("方式二:使用HashSet实现List去重");
  System.out.println("原来集合大小:"+twoList.size()+",集合元素>>"+twoList);
  Date twoDateBegin = new Date();
  repeatListWayTwo(twoList);
  System.out.println("集合去重大小:"+twoList.size()+",集合元素>>"+twoList);
  Date twoDateEnd = new Date();
  System.out.println("去重所需时间:"+(twoDateEnd.getTime()-twoDateBegin.getTime())+"毫秒");

  System.out.println("方式三:使用TreeSet实现List去重");
  System.out.println("原来集合大小:"+thirdList.size()+",集合元素>>"+thirdList);
  Date thirdDateBegin = new Date();
  repeatListWayThird(thirdList);
  System.out.println("集合去重大小:"+thirdList.size()+",集合元素>>"+thirdList);
  Date thirdDateEnd = new Date();
  System.out.println("去重所需时间:"+(thirdDateEnd.getTime()-thirdDateBegin.getTime())+"毫秒");

  System.out.println("方式四:利用List集合contains方法循环遍历去重");
  System.out.println("原来集合大小:"+fourthList.size()+",集合元素>>"+fourthList);
  Date fourthDateBegin = new Date();
  repeatListWayFourth(fourthList);
  System.out.println("集合去重大小:"+fourthList.size()+",集合元素>>"+fourthList);
  Date fourthDateEnd = new Date();
  System.out.println("去重所需时间:"+(fourthDateEnd.getTime()-fourthDateBegin.getTime())+"毫秒");
}

多次运行结果如下:

第一次四种方式运行时间如下:223、10、16、30;

第二次四种方式运行时间如下:164、10、17、43;

第三次四种方式运行时间如下:164、9、16、37;

综合代码及运行时间对比,方式二是最好的去重方式,代码最简洁、耗时最短,但是顺序可能会被打乱,如果需要按原顺序,方式三比较好。你平时List集合去重,方式用对了吗?

总结

到此这篇关于Java中List集合去重方法以及效率对比的文章就介绍到这了,更多相关java List集合去重效率内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java集合中contains方法的效率对比分析

    最近让部门技术大佬帮忙代码review的时候,他给我指出了一个小的技术细节,就是对于集合的contains方法尽量选用Set而不是List,平时没怎么注意,仔细看了下源码,大佬就是大佬,技术细节也把握的死死的. Java集合List.Set中均有对集合中元素是否存在的判断方法contains(Object o):Map中有对key及value是否存在的判断方法containsKey(Object key)和containsValue(Object value). 1.ArrayList 在Arr

  • java与C 代码运行效率的对比(整理)

    1.Java 语言的概述 作为一种面向对象的程序设计语言,Java 与 C++极为 类似,但却要比 C++简单的多.它在集成其他语言的特点 和优势的同时又有自己独特的优势. Java 的主要特点如下: (1)简单性.Java 可以对内存中产生的垃圾进行自动收集, 大幅度降低了程序的复杂程度,此外,Java 添加了更为实 用的功能的,这使得程序开发更加简单可靠. (2)平台独 立性.Java 语言在程序编程过程中是先编译成中间码,然 后再进行装载与校验,最后通过翻译出来的不同的机器码 来执行.因此

  • Java contains用法示例

    学习Demo  contains方法:用于判断list集合是否包含某个元素 containsKey方法:用于判断Map键中是否包含某个键 containsValue方法:用于判断map中是否包含某个value值 码上行动 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * contains方法用于判断list集合是否包含某个元素 * con

  • Java 集合的Contains和Remove方法

    一.包含与删除两种方法解析 1.boolean contains(Object o);判断集合中是否包含某个元素. package com.bjpowernode.java_learning; import java.util.*; ​ public class D85_1_ContainsMethod { public static void main(String[] args) { //创建集合 Collection c = new ArrayList(); //创建两个Integer类型

  • javaweb开发提高效率利器JRebel详解

    JRebel用了有一段时间了,发现确实好用,节省了很多不必要的时间,提高了开发效率.在这里记录一下他的安装和使用过程,希望能帮助到有需要的人. 官网:https://www.jrebel.com/ 一.JRebel简介 jrebel是国外公司perforce于2007年开发的一款java开发效率工具,旨在帮助java开发人员更快地编写更好的应用程序.jrebel提供了常用的开发IDE如IntelliJ Idea.eclipse.myEclipse.NetBeans等的jrebel插件,可以很方便

  • Java中List集合去重方法以及效率对比

    List集合相信大家在开发过程中几乎都会用到.有时候难免会遇到集合里的数据是重复的,需要进行去除.然而,去重方式有好几种方式,你用的是哪种方式呢?去重方式效率是否是最高效.最优的呢?今天就给大家讲解一下List集合去重的常见及常用的四种方式. 01 实现思路:使用两个for循环遍历集合所有元素,然后进行判断是否有相同元素,如果有,则去除.这种方式是大部分最先想到的,也是最简单的实现方式.其中,这种方式可以保证List集合原来的顺序不变. 代码实现: /** * notes:使用两个for循环实现

  • Java中List集合对象去重及按属性去重的8种方法

    最近在写一些关于java基础的文章,但是我又不想按照教科书的方式去写知识点的文章,因为意义不大.基础知识太多了,如何将这些知识归纳总结,总结出优缺点或者是使用场景才是对知识的升华.所以我更想把java相关的基础知识进行穿针引线,进行整体上的总结. 总结java中创建并写文件的5种方式 总结java从文件中读取数据的6种方法 总结java创建文件夹的4种方法及其优缺点 总结java中删除文件或文件夹的7种方法 总结java中文件拷贝剪切的5种方式 比如之前我已经写了上面的这些内容,如果对java基

  • Java中对List去重 Stream去重的解决方法

    问题 当下互联网技术成熟,越来越多的趋向去中心化.分布式.流计算,使得很多以前在数据库侧做的事情放到了Java端.今天有人问道,如果数据库字段没有索引,那么应该如何根据该字段去重?大家都一致认为用Java来做,但怎么做呢? 解答 忽然想起以前写过list去重的文章,找出来一看.做法就是将list中对象的hashcode和equals方法重写,然后丢到HashSet里,然后取出来.这是最初刚学Java的时候像被字典一样背写出来的答案.就比如面试,面过号称做了3年Java的人,问Set和HashMa

  • Java中List集合去除重复数据的方法汇总

    List集合概述 List集合是一个元素有序(每个元素都有对应的顺序索引,第一个元素索引为0).且可重复的集合. List集合常用方法 List是Collection接口的子接口,拥有Collection所有方法外,还有一些对索引操作的方法. void add(int index, E element);:将元素element插入到List集合的index处: boolean addAll(int index, Collection<? extends E> c);:将集合c所有的元素都插入到

  • Java中Map集合(接口)的基本方法程序演示

    本文实例为大家分享了Java中Map集合的基本方法程序演示的具体代码,供大家参考,具体内容如下 package pack02; import java.util.*; public class MapDemo { public static void main(String[] args) { //定义一个Map接口类型的引用,指向HashMap类型的对象 Map<String,String> ma = new HashMap<String, String>(); ma.put(&

  • 深入剖析java中的集合框架

    解析:如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,那么可以使用Java集合框架. 如果启用集合的删除方法,那么集合中所有元素的索引会自动维护. 集合完全弥补了数组的缺陷. 02.集合框架的内容 集合框架都包含三大块内容:对外的接口,接口的实现和对集合运算的算法 01.接口:表示集合的抽象数据类型 02.实现:集合框架中接口的具体实现 03.算法:在一个实现了某个集合框架的接口的对象身上完成某种有用的计算方法 java集合框架简图: 01.Collection接口存在储存一组

  • Java中List集合的遍历实例详解

     一.对List的遍历有三种方式   List<String> list = new ArrayList<String>(); list.add("testone"); list.add("testtwo"); ... 第一种: for(Iterator<String> it = list.iterator(); it.hasNext(); ) { .... } 这种方式在循环执行过程中会进行数据锁定,    性能稍差,    同

  • 如何去除Java中List集合中的重复数据

    1.循环list中的所有元素然后删除重复 public class duplicatRemoval { public static List removeDuplicate(List list){ for(int i=0;i<list. size()-1;i++){ for(int j=list.size()-1;j>i;j--){ if(list. get(j). equals(list.get(i))){ list.remove(j); } } } return list; } } 总结:

  • java中避免集合死链调用详情

    目录 1. 前言 2. 场景 3. 环境 3.1 开发环境准备 3.2 数据准备 3.2.1 Mysql数据库表及数据 3.2.2 redis库数据 4. 解决方式 5.完整代码 5.1 Model 5.2 Controller 5.3 Service 5.4 Service 实现类 6.测试 1. 前言  开发过程中, 一些集合 的变动会触发任务去 改变 其他的集合 ,为了保障任务的正确执行,应避免出现死循环调用,即对 集合之间的影响关系 进行一些限制.怕日后遗忘,特在此记录. 2. 场景 A

  • Java中List集合的深入介绍(超级推荐!)

    目录 1,Java集合介绍 2,List介绍 2.1 ArrayList集合 2.2 LinkedList集合 3,List常用方法 3.1 ArrayList 基本操作 3.2 LinkedList 基本操作 4,ArrayList和LinkedList比较 5,ArrayList源码分析 6,LinkedList源码分析 7,小结 1,Java集合介绍 作为一个程序猿,Java集合类可以说是我们在工作中运用最多.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加方便开发. Ja

随机推荐