List、Set、Map三者之间的关系

1、数据结构与核心特性

接口数据结构顺序性唯一性键值对null 元素
List动态数组/链表有序(插入顺序)允许重复允许多个 null
Set哈希表 / 红黑树无序(HashSet)有序(LinkedHashSet/TreeSet)不允许重复仅 HashSet/LinkedHashSet 允许 1 个 null
Map哈希表 / 红黑树 链表长度≥8 时转红黑树无序(HashMap)有序(LinkedHashMap/TreeMap)键(Key)唯一键:HashMap 允许 1 个 null值

2、实现类对比

List

  • ArrayList:基于动态数组,随机访问快(O (1)),插入 / 删除慢(O (n))。
  • LinkedList:基于双向链表,插入 / 删除快(O (1)),随机访问慢(O (n))。
  • Vector:线程安全(同步方法),性能低于 ArrayList。
    Set
  • HashSet:基于 HashMap,无序,依赖hashCode()和equals()。
  • LinkedHashSet:继承 HashSet,维护插入顺序(或访问顺序)。
  • TreeSet:基于 TreeMap,有序(自然排序或自定义 Comparator),不允许 null。
    Map
  • HashMap:线程不安全,允许 null 键 / 值,无序。
  • LinkedHashMap:继承 HashMap,维护插入顺序(或访问顺序)。
  • TreeMap:基于红黑树,按键排序(自然排序或自定义 Comparator),不允许 null 键。
  • ConcurrentHashMap:线程安全(分段锁 / CAS),高并发场景优先选择。
  • Hashtable:线程安全(同步方法),不允许 null 键 / 值,性能低。

3、线程安全性

  • List:ArrayList/LinkedList 非线程安全,Vector/CopyOnWriteArrayList 线程安全。
  • Set:HashSet/TreeSet 非线程安全,CopyOnWriteArraySet/ConcurrentSkipListSet 线程安全。
  • Map:HashMap/TreeMap 非线程安全,ConcurrentHashMap/Hashtable 线程安全。

4、适用场景

  • List:需要有序、可重复数据,频繁随机访问(如分页查询结果)。
  • Set:需要去重、无需顺序(如权限去重),或需要有序且唯一(如排行榜)。
  • Map:需要键值对映射(如配置缓存),或需要按键排序(如时间轴数据)。

5、性能优化

  • 初始容量:创建集合时预估大小,避免频繁扩容(如new ArrayList<>(100))。
  • HashMap 加载因子:默认 0.75,高并发场景可调整以平衡空间和时间。
  • TreeSet/TreeMap:插入 / 删除 / 查询时间复杂度 O (log n),适用于需要排序的场景。

6、常见坑点

  • Set 去重依赖方法:自定义对象需重写hashCode()和equals()。
  • Map 的键不可变:使用自定义对象作为键时,确保其不可变(如 String、Integer)。
  • ConcurrentHashMap 迭代器弱一致性:迭代时不抛出ConcurrentModificationException,但可能反映部分修改。

7、源码层面理解

  • ArrayList 扩容机制:每次扩容为原容量的 1.5 倍(oldCapacity + (oldCapacity >> 1))。
  • HashMap哈希冲突处理:链表 + 红黑树(JDK 8+,链表长度≥8 且容量≥64 时转换为树)。
  • TreeSet 排序实现:基于 TreeMap 的NavigableMap接口,通过compareTo()或Comparator排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89897.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程控制----进程终止

一、进程终止的核心场景正常终止&#xff08;代码完整运行完毕&#xff09;成功&#xff1a;进程执行到main函数结束或调用exit()&#xff0c;返回退出码 0&#xff08;约定为执行成功&#xff09;。失败&#xff1a;代码执行完毕但结果异常&#xff0c;返回非零退出码&#xf…

Milvus docker-compose 部署

文章目录 前言Milvus docker-compose 部署1. 下载2. 修改配置3. 启动4. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的…

EveryThing搜索具体路径下文件中的内容

1.打开EveryThing 2.点击搜索&#xff0c;选择高级搜索 3.选择需要搜索的文件的路径以及文件中需要包含的内容 4.之后就可以搜索到对应的目标文件

【算法】宽度优先遍历BFS

二叉树的宽搜 429、N叉树的层序遍历 题解 BFS核心思想 二叉树的宽搜一般都是借助队列来实现的&#xff0c;实现的原理为首先将根节点进行放入队列中&#xff0c;然后将根节点进行弹出的时候&#xff0c;将这个节点的孩子节点进行放入队列中&#xff0c;然后继续弹出队头的元…

【STM32】通用定时器基本原理

STM32 通用定时器基本原理&#xff08;基于 STM32F1&#xff09;参考资料&#xff1a;STM32F1xx官方资料&#xff1a;《STM32中文参考手册V10》-第14章通用定时器STM32 定时器分类 STM32F103 系列共有三类定时器&#xff1a;&#x1f50e; 通用定时器&#xff08;TIM2~TIM5&…

【Go语言-Day 14】深入解析 map:创建、增删改查与“键是否存在”的奥秘

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

Vue脚手架搭建项目+基础知识

1. 使用脚手架创建项目1.1 准备工作winR&#xff0c;在弹出的数据框中输入cmd&#xff0c;数据命令查看node以及npm版本 下载vue cli1.2 创建项目1.2.1 创建一个英文目录文件夹&#xff0c;cmd打开命令命令提示符1.2.2 vue ui命令打开控制台1.2.3 创建项目创建成功1.3 项目结构…

微信小程序下单页—地址列表页—新增地址页 页面交互

新增地址流程&#xff1a; 下单页 → 地址列表页 (1次跳转)地址列表页 → 新增地址页 (1次跳转)保存地址 → 返回地址列表页 (1次返回&#xff0c;自动刷新列表) 选择地址流程&#xff1a; 地址列表页 → 选中地址 → 返回下单页 (1次返回) 更换地址&#xff1a; 下单页 → 地址…

JVM与JMM

为了更清晰地对比JVM和JMM&#xff0c;我们可以采用表格形式&#xff0c;从定义、功能、结构、与多线程关系等方面进行详细比较&#xff1a; 对比项JVM&#xff08;Java Virtual Machine&#xff09;JMM&#xff08;Java Memory Model&#xff09;定义一种虚构的计算机&#x…

【Docker基础】Docker数据卷管理:docker volume rm及其参数详解

目录 1 引言&#xff1a;Docker Volume 的生命周期管理 2 docker volume rm命令基础 2.1 命令作用 2.2 命令语法 3 参数深度解析 3.1 基础参数表 3.2 高级参数详解 3.2.1 --force&#xff08;-f&#xff09; 4 Volume删除前置条件 4.1 可删除状态判断 4.2 常见报错处…

嵌入式系统内核镜像相关(十)

文章目录 前言一、点亮多个led灯的基础实验以及其中的问题1.1 基础流程1.1.1 alinx教程的问题1.1.1.1 驱动程序中的亮/灭逻辑修改&#xff01;1.1.1.1.1 逻辑错误的修改1.1.1.1.2 多灯亮/灭 1.1.1.2 驱动程序中引脚的问题以及与裸机开发的区别&#xff08;重要&#xff09;1.1.…

Word和Excel批量转PDF新方法,操作简单

PDF是一种跨平台的文档格式&#xff0c;无论在任何设备上查看&#xff0c;其排版、字体和图像都不会发生变化。这确保了文档的一致性&#xff0c;避免了由于不同软件版本或操作系统引起的显示问题。这款小巧的工具大小不到2MB&#xff0c;使用起来异常简单。只需要把需要转换的…

AI搜索 MCP最佳实践

背景 那些 LLM 不知道的事 尝试直接询问LLM“今天天气如何”时&#xff0c;会发现LLM无法回答——它既不知道“今天”是哪天&#xff0c;也无法获取地理位置信息。这揭示了LLM的局限&#xff1a;缺乏与外部工具和实时数据的交互能力。 为解决这一问题&#xff0c;MCP&#x…

JVM 简介与作用

&#x1f680; JVM 简介与作用 &#x1f4da; 深入理解 Java 虚拟机的核心概念与重要作用 &#x1f4d6; 目录 &#x1f914; 什么是 Java 虚拟机&#xff08;JVM&#xff09;&#x1f310; JVM 在 Java 生态中的核心地位&#x1f500; JVM 跨平台原理剖析&#x1f4dd; 总结 …

✨ OpenAudio S1:影视级文本转语音与语音克隆Mac整合包

✨ OpenAudio S1&#xff1a;影视级文本转语音与语音克隆Mac整合包 &#x1f680; OpenAudio S1 简介 OpenAudio S1 是由 Fish Audio 开发的 Fish Speech 系列的最新一代人工智能语音生成模型。该模型旨在大幅提升 AI 语音生成的技术水平&#xff0c;为用户提供更加自然、富有表…

spring加载外部properties文件属性时,读取到userName变量值和properties文件的值不一致

问题 使用spring DI注入外部properties文件属性时&#xff0c;读取到userName变量值和properties文件的值不一致。 bean属性注入&#xff1a; <!--加载配置文件--> <context:property-placeholder location"classpath:*.properties"/><bean id"…

黑马点评系列问题之基础篇p7 06初识redis无法在虚拟机查到图形化界面存进去的键

问题描述 在RESP中输入了一些键(name,age等这些) 但是在图形化界面里面输入的&#xff0c;在非图形化界面就找不到&#xff0c;在非图形化界面里输入的&#xff0c;在图形化界面里就可以查到。 原因分析及解决 经过多次实验&#xff0c;发现是因为在添加键名的时候&#xff0…

在VMware虚拟机中安装Windows 98时,Explorer提示“该程序执行了非法操作,即将关闭”的解决办法

在使用iso文件&#xff08;MD5: 0E496B5DCC519F550AAF0BCFBB4A11EA&#xff09;安装Windows98时&#xff0c;遇到此提示。 虽然原因未知&#xff0c;也无需深入探究&#xff0c;但是根据网友在 https://www.bilibili.com/opus/435866522585702782 中给出的相似经验&#xff…

在浏览器中使用SQLite(官方sqlite3.wasm)

有人可能会问&#xff1a;既然浏览器里又内置得IndexedDB&#xff0c;而且在IndexedDB里存数据&#xff0c;关了浏览器数据也不会丢&#xff0c;为什么还要在浏览器里用SQLite? 实际上&#xff0c;当 IndexedDB 内的数据量增多&#xff0c;数据和数据之间的关系变得复杂&…

数据结构(Java)--位运算

前言 本文为本小白学习数据结构的笔记&#xff0c;将以算法题为导向&#xff0c;向大家更清晰的介绍数据结构相关知识&#xff08;算法题都出自B站马士兵教育——左老师的课程&#xff0c;讲的很好&#xff0c;对于想入门刷题的人很有帮助&#xff09; 为什么要使用为位运算 位…