List 一定有序,Set不一定无序 ---AND--- 去除List集合中的重复值(6种好用的方法)----ANG--为什么Set会去重

Flutter List数组避免插入重复数据的实现 List 具有一定长度存在索引的对象集合(长度为0不存在索引,长度>0存在索引) 常见列表 1、定长列表 默认值null 例如:List fixedLengthList = new List(2)、List fixedLengthList = new List(8) List fixedLengthList = new List(2); for(int i=0;i<2;i++){ print(索引为${i}的值${fixedLengthList[i]}); } I/flutter ( 9251): 索引为0的值null I/flutter ( 9251 立即下载

0、

Set之所以会去重,和map有很大的关系。
看源码你会发现HashSet底层使用HashMap存储
TreeSet底层使用TreeMap存储
LinkedHashSet底层使用LinkedHashMap存储

 

拿HashSet为例子,我们查看add()方法的源码

 public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

 

 

 

return的map对象其实是 一个HashMap

 

  private transient HashMap<E,Object> map;1

再看map.put(e, PRESENT)
被传进来的泛型对象当成了Map的键,因为Map键值重复的话新的键会覆盖旧的键值,所以Set不会重复。
 

1、我们经常听说List是有序且重复的, Set 是无序不重复的。这里有个误区,这里说的顺序有两个概念,一是按添加的顺序排列,二是按自然顺序 a-z 排列。 Set 并不是无序的,传统说的
Set 无序是指 HashSet, 它不能保证元素的添加顺序,更不能保证自然顺序,而 Set 的其他实现类是可以实现这两种顺序的。

先来看看一段测试代码:


public class CollectionTest {
    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<String>();
        arrayList.add("s1");
        arrayList.add("s3");
        arrayList.add("s4");
        arrayList.add("s5");
        arrayList.add("s2");
        System.out.println("ArrayList:==========================");
        for(String arrList : arrayList){
            System.out.println(arrList);
        }
        List<String> linkedList = new LinkedList<String>();
        linkedList.add("s1");
        linkedList.add("s3");
        linkedList.add("s4");
        linkedList.add("s5");
        linkedList.add("s2");
        System.out.println("LinkedList:===========================");
        for(String linkList : linkedList){
            System.out.println(linkList);
        }
        
        Set<String> hashSet = new HashSet<String>();
        hashSet.add("s1");
        hashSet.add("s3");
        hashSet.add("s4");
        hashSet.add("s5");
        hashSet.add("s2");
        System.out.println("HashSet:==============================");
        for(String hashst: hashSet){
            System.out.println(hashst);
        }
        
        Set<String> linkedHashSet = new LinkedHashSet<String>();
        linkedHashSet.add("s1");
        linkedHashSet.add("s3");
        linkedHashSet.add("s4");
        linkedHashSet.add("s5");
        linkedHashSet.add("s2");
        System.out.println("LinkedHashSet:=========================");
        for(String linkedst : linkedHashSet){
            System.out.println(linkedst);
        }
        
        Set<String> treeSet = new TreeSet<String>();
        treeSet.add("s1");
        treeSet.add("s3");
        treeSet.add("s4");
        treeSet.add("s5");
        treeSet.add("s2");
        System.out.println("TreeSet:==============================");
        for(String treest : treeSet){
            System.out.println(treest);
        }
    }

下面输出的结果:

ArrayList:==========================
s1
s3
s4
s5
s2
LinkedList:===========================
s1
s3
s4
s5
s2
HashSet:==============================
s3
s4
s5
s1
s2
LinkedHashSet:=========================
s1
s3
s4
s5
s2
TreeSet:==============================
s1
s2
s3
s4
s5

怎么样看出来了吧,我们通常说的 List 是you序的指的就是最后集合中的元素顺序就是按照添加时候的顺序排列的(无论是实现类 ArrayList, 还是 LinkedList)。但是我们发现 Set 所谓的无序就是在 HashSet 这个实现类中才会出现的这种情况,而 LinkedHashSet 已经和 List 的结果相同了,再看 TreeSet 实现的功能是根据元素的自然顺序排列了



作者:巧克力er
链接:https://www.jianshu.com/p/6f0da4dfcb09
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

2、最近项目中需要对list集合中的重复值进行处理,大部分是采用两种方法,一种是用遍历list集合判断后赋给另一个list集合,一种是用赋给set集合再返回给list集合。 

但是赋给set集合后,由于set集合是无序的,原先的顺序就打乱了。所以我又想着能不能用set的特性进行去重又不打乱顺序呢? 
试了一下,也是可以的,几种方法在不同情况下都有各自的优势。现在将代码写出来,比较一下。

    //set集合去重,不打乱顺序
    public static void main(String[] args){
         List<String> list  =   new  ArrayList<String>(); 
         list.add("aaa");
         list.add("bbb");
         list.add("aaa");
         list.add("aba");
         list.add("aaa");

         Set set = new  HashSet(); 
         List newList = new  ArrayList(); 
         for (String cd:list) {
            if(set.add(cd)){
                newList.add(cd);
            }
        }
         System.out.println( "去重后的集合: " + newList); 
      }
     //遍历后判断赋给另一个list集合
     public static void main(String[] args){
         List<String> list  =   new  ArrayList<String>(); 
         list.add("aaa");
         list.add("bbb");
         list.add("aaa");
         list.add("aba");
         list.add("aaa");

         List<String> newList = new  ArrayList<String>(); 
         for (String cd:list) {
            if(!newList.contains(cd)){
                newList.add(cd);
            }
        }
         System.out.println( "去重后的集合: " + newList); 
      }
    //set去重
    public static void main(String[] args){
         List<String> list  =   new  ArrayList<String>(); 
         list.add("aaa");
         list.add("bbb");
         list.add("aaa");
         list.add("aba");
         list.add("aaa");

        Set set = new  HashSet(); 
         List newList = new  ArrayList(); 
         set.addAll(list);
         newList.addAll(set);

         System.out.println( "去重后的集合: " + newList); 
     }
        //set去重(缩减为一行)
        public static void main(String[] args){
             List<String> list  =   new  ArrayList<String>(); 
             list.add("aaa");
             list.add("bbb");
             list.add("aaa");
             list.add("aba");
             list.add("aaa");

             List newList = new ArrayList(new HashSet(list)); 

             System.out.println( "去重后的集合: " + newList); 
         }

hashset不进行排序,还有一种方法是用treeset,去重并且按照自然顺序排列,将hashset改为treeset就可以了。(原本的顺序是改变的,只是按照字母表顺序排列而已)

//去重并且按照自然顺序排列
List newList = new ArrayList(new TreeSet(list)); 
(10)Proteus 8.9上的STM32仿真系列(HAL)---freertos 实验设计:通过cubemxide生成freertos工程,然后创建一个 pc13 led灯间隔200ms闪烁的任务。非常遗憾的是proteus8.9仿真失败,实物上没有问题,但还是把流程过一遍。 一、原理图 实物是淘宝上stm32f103 c8t6的核心板,proteus上没有这个芯片,这里图上大概表示一下,用的是核心板自带的pc13引脚的led灯。 二、cubemxide配置 1.RCC如之前工程一样配置 2、配置SYS timebase Source不要使用systick,自己选择一个定时器,我这 阅读详情

相关推荐

用ESP32-S3打造迷你录音笔:SPIFFS存储+INMP441麦克风全流程解析

本文详细解析了如何使用ESP32-S3微控制器与INMP441数字麦克风构建迷你录音笔。内容涵盖硬件选型、I2S驱动配置、SPIFFS文件系统存储管理以及WAV格式封装等全流程,重点探讨了在资源受限的嵌入式设备上实现高质量语音采集与存储的优化方案和实战技巧。

qq_27496129的博客 1366

Set接收的数据,排序乱了怎么办?

private Set getSubsystem(List resourceList) { Set subsystemName = new HashSet&lt;&gt;(); for (SysResource sysResource : resourceList) { subsystemName.add(sysResource.get...

whatTheFuckOfyou的博客 1305

影刀RPA:轻松搞定Excel表格自动化操作

影刀RPA是一款功能强大的自动化工具,通过模拟人类操作实现各种重复性任务的自动化。零代码操作:通过拖拽式流程设计器,无需编程基础即可快速上手。功能丰富:提供丰富的组件库,涵盖文件操作、数据处理等多种功能。高效稳定:支持多任务并行,确保任务的高效执行和稳定性。支持Python语法:内置数据表格,支持Python语法,对新手友好,同时具备循环功能。通过影刀RPA,您可以轻松实现Excel表格的拆分、列数据合并和归档工作的自动化。这不仅节省了手动操作的时间,还能确保数据处理的高效和准确,提升工作效率和管理水平。

watwrmoon的博客 2560

List集合和Set集合

List集合和Set集合 List中元素存取是有序的、可重复的;Set集合中元素是无序的,不可重复的。 CopyOnWriteArrayList:COW的策略,即写时复制的策略。适用于读多写少的并发场景 Set集合元素存取无序,且元素不可重复。 HashSet不保证迭代顺序,线程不安全;LinkedHashSet是Set接口的哈希表和链接列表的实现,保证迭代顺序,线程不安全

八点二十四分 490

Qt for Android:基于libusb实现CH340x串口通信的高效开发方案

本文详细介绍了在Qt for Android环境下,基于libusb实现CH340x串口通信的高效开发方案。通过绕过Android高版本系统的权限限制,利用libusb+JNI技术实现稳定通信,适用于工业手持终端等场景。文章涵盖环境搭建、核心实现、常见问题解决方案及性能调优经验,帮助开发者快速掌握这一关键技术。

weixin_42715608的博客 426

揭秘无人机前沿领域的科技新突破

本文旨在系统性地介绍无人机技术在前沿领域的最新突破,涵盖从基础理论到实际应用的各个方面。我们将重点关注那些正在改变无人机行业面貌的关键技术创新,并分析它们对未来发展的影响。文章首先介绍无人机技术的基础概念和背景,然后深入探讨六个关键领域的技术突破,接着分析实际应用案例,最后展望未来发展趋势。自主导航系统(SLAM):同时定位与地图构建技术,使无人机能在未知环境中自主导航计算机视觉(CV):使无人机能够"看"和理解周围环境的技术5G通信:第五代移动通信技术,提供高速、低延迟的数据传输能源管理。

AI天才研究院 1490

HashSet、LinkedSet、TreeSet插入元素顺序情况

HashSet在插入元素时采取的是无序方式,即本身内部按照哈希值进行排序操作。 LinkedSet在插入元素时元素按照自然顺序进行排放,即插入元素时元素的排放顺序与插入顺序一致。 TreeSet按照升序顺序进行数据的存放,即插入元素后元素在TreeSet内部按照升序进行存放。

qq_54870665的博客 1169

《QGIS快速入门与应用基础》161:面要素顶点编辑与形状调整

本文系统讲解了QGIS中面要素顶点编辑与形状调整的核心操作。首先明确了顶点编辑的适用场景与核心概念,强调需满足图层类型、编辑模式、要素选择等六大前提。详细介绍了编辑顶点工具(F2键)的激活路径及配套辅助工具,通过耕地地块修正案例,分步骤演示顶点移动、添加(双击/工具栏)、删除(Delete键)三大基础操作。同时提供捕捉工具开启、画布缩放等实用技巧,帮助用户高效完成面要素的精细化调整,解决实际工作中的形状偏差问题。全文图文结合,步骤清晰,适合GIS新手快速掌握面要素编辑的核心技能。

LuckyHanMo的博客 480

flutter 数组数据去重终极解决方案

在 Flutter 应用程序开发中,处理数据的去重是一个常见的任务。本文将详细介绍 Flutter 中的各种数据去重方法,包括使用 Set、fold 方法、where 方法、自定义函数以及使用第三方库等不同的技巧。每种方法都将提供示例代码和解释,帮助您理解和应用这些方法,以满足不同的需求。数组去重是指从一个包含重复元素的数组中,将重复的元素去除,得到一个只包含唯一元素的新数组。在去重后的数组中,每个元素都是唯一的,不会存在重复的情况。通常情况下,数组去重是为了简化数据,减少重复信息或提高数据处理的效率。

半身风雪 3755

黑猫带你学UFS协议第1篇:全网最全UFS协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

本文由黑猫学长撰写,深入解析UFS协议,覆盖从基础概念到高级特性的全方位教程。适合存储芯片行业从业者和嵌入式开发者,旨在帮助读者快速掌握UFS协议,适用于高端智能手机、平板等智能设备。预计15万字,涵盖UFS 3.1协议,讲解UFS协议栈、物理层、链路层、传输层等内容。

黑猫奥利奥的博客 3687

游戏开发中的CV:实时动作捕捉与虚拟交互

游戏开发中的CV:实时动作捕捉与虚拟交互​ ,人工智能,计算机视觉,大模型,AI,在当今游戏产业中,玩家对游戏体验的要求日益提高,追求更加真实、沉浸的交互感受。计算机视觉(Computer Vision,CV)技术的飞速发展,为游戏开发带来了革命性的突破,其中实时动作捕捉与虚拟交互技术更是成为提升游戏品质的核心驱动力。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 16万+

Flutter: List去重

List trans=['1','1','2','3','1','2']; main() async { trans= trans.toSet().toList(); print(trans); } 打印出 [1, 2, 3]

zjy_hll的专栏 3895

1.2 amdgpu_bo的设计分析 — gem层和ttm层

本文分析了AMD KFD的BO设计架构,重点介绍了DRM子系统中缓冲对象的多层继承关系。文章首先展示了核心继承层次图,包括DRM通用层(drm_gem_object)、TTM内存管理层(ttm_buffer_object)、AMD驱动层(amdgpu_bo)和KFD计算层(kgd_mem)。随后详细解析了drm_gem_object结构体的关键功能,包括用户空间接口管理、内存映射支持、引用计数机制以及DMA-BUF导入/导出功能。

图形/计算GPU的驱动与虚拟化技术分享园地 2539

Flutter List去重方式记录

类型一: List list = ['1','2','2','3']; list = list.toSet().toList(); 可以得到去重效果 类型二: List list = [{'id':1,'name':'小明'},{'id':1,'name':'小红'},{'id':1,'name':'小明'},]; final ids = list .map((e) => e['id']).toSet(); list .retainWhere((x) => ids.remove(x

wxx314165038的博客 3383

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JAVA[学习] list 去重

ArrayList 去重在写java代码中会用到ArrayList,使用过程中有一些比较奇葩的业务,需要对重复的数据去重。 在网上找了几种方法 利用HashSet里面的元素不可重复 利用list里面contains方法比较是否存在去重 首页我试验了第一种方法public static void main(String args[]){ ArrayList<Integer> arrayList

风的方向 5415

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java:List 去重的 6 种方法,这种方法最完美!

这样不就没有重复数据的问题了嘛?Stream 实现去重功能和其他方法不同的是,它不用新创建集合,使用自身接收一个去重的结果就可以了,并且实现代码也很简洁,并且去重后的集合顺序也和原集合的顺序保持一致,是我们最优先考虑的去重方法。此方法的优点的:理解起来比较简单,并且最终得到的集合也是有序的,这里的有序指的是新集合的排列顺序和原集合的顺序是一致的;此方法的实现比上一种方法的实现代码要少一些,并且不需要新建集合,但此方法得到的新集合是无序的,也就是新集合的排列顺序和原集合不一致,因此也不是最优的解决方案。

pangjl1982的专栏 8995

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

使用java8新特性stream实现List去重:128毫秒。使用java8新特性stream实现List去重:125毫秒。使用java8新特性stream实现List去重:201毫秒。使用java8新特性stream实现List去重:78毫秒。使用TreeSet实现List去重时间:103毫秒。使用HashSet实现List去重时间:40毫秒。使用TreeSet实现List去重时间:36毫秒。使用HashSet实现List去重时间:32毫秒。使用TreeSet实现List去重时间:40毫秒。

Goals1989的博客 3774

List-有序集合

目录ListList集合概述和特点List集合特有方法并发修改异常ListIterator增强for循环List集合子类特点LinkedList集合的特有功能先到帮助文档中查看:它在java.util包下,使用它需要导包。是泛型,是List集合中的类型。往下看List是一个接口它继承自Collection接口,所以Collection接口中有的功能List都可以使用。List被称为有序集合也被称为序列。用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表...

weixin_67796933的博客 1万+

List、Set、Map底层原理详解(面试必背)

HashMap底层原理、List集合介绍、Set集合介绍

ydl1128的博客 3558

java语言基础知识点(每日更新6.27)②

1、以下哪项陈述是正确的? 正确答案: E A.垃圾回收线程的优先级很高,以保证不再使用的内存将被及时回收 B.垃圾收集允许程序开发者明确指定释放哪一个对象 C.垃圾回收机制保证了JAVA程序不会出现内存溢出 D.进入”Dead”状态的线程将被垃圾回收器回收 E.以上都不对 2、下面代码的输出结果是什么? 正确答案: D A.3 B.123 C.1 D.12 3、Java类Demo中存在方法func1、func2、func3和func4,请问该方法中,哪些是不合法的定义?( ) 正确答案: A D func

mingshengda的博客 1080

Java:List列表去重有序和无序

【代码】Java:List列表去重有序和无序。

彭世瑜的博客 808

Flutter两个List元素去重返回新List简单例子

不多解释,不懂记得去查。

Delphi_7710的博客 386

Flutter List数组避免插入重复数据

志当存高远。——诸葛亮 List 具有一定长度存在索引的对象集合(长度为0不存在索引,长度>0存在索引)

我很好 8147

【Java】List集合去重的方式

List集合去重的方式

斯基的朦胧 7052

JAVA之List去重

JAVA之List去重

風林火山zyw的博客 1274

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 223
上一篇: Freemaker Replace函数的正则表达式运用
下一篇: NonUniqueObjectException问题的解决------手动修改数据库的因果
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值