List、Set、Map详解和区别
在 Java 中,List
、Set
、Map
是常用的集合类型,它们各自具有不同的特点和用途,以下是对它们的详细介绍及区别分析:
List(列表)
- 特点:
- 有序性:
List
中的元素是有序的,即元素的存入顺序和取出顺序是一致的。例如,先存入元素A
,再存入元素B
,那么按照顺序取出时,会先得到A
,然后是B
。 - 可重复性:允许存储重复的元素。可以在同一个
List
中多次添加相同的对象。 - 元素可通过索引访问:能够通过索引(下标)来获取、修改或删除元素,索引从
0
开始,就像操作数组一样方便。例如,可以使用list.get(0)
获取列表中的第一个元素。
- 有序性:
- 常见实现类及用法:
ArrayList
:- 内部基于数组实现,查询效率高,因为可以通过数组下标直接定位元素。例如,在一个存储大量学生信息的
ArrayList
中查找某个学生的信息,通过索引访问速度很快。 - 但是在进行频繁的插入和删除操作(尤其是在列表中间位置操作)时,效率相对较低,因为需要移动后续元素来保证顺序和连续性。示例代码如下:
import java.util.ArrayList; import java.util.List;public class ArrayListExample {public static void main(String[] args) {List<String> arrayList = new ArrayList<>();arrayList.add("Apple");arrayList.add("Banana");arrayList.add("Apple"); // 允许重复添加System.out.println(arrayList.get(0)); // 通过索引获取元素arrayList.remove(1); // 删除指定索引位置的元素} }
- 内部基于数组实现,查询效率高,因为可以通过数组下标直接定位元素。例如,在一个存储大量学生信息的
LinkedList
:- 内部基于链表结构实现,在进行插入和删除操作时效率较高,尤其是在链表的首尾位置进行操作。例如,在实现一个队列或者栈的数据结构时,使用
LinkedList
会很方便。 - 不过,查询效率相对
ArrayList
较低,因为要遍历链表节点来查找元素。示例代码如下:import java.util.LinkedList; import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> linkedList = new LinkedList<>();linkedList.add("Dog");linkedList.add("Cat");linkedList.addFirst("Bird"); // 在链表头部添加元素linkedList.addLast("Fish"); // 在链表尾部添加元素System.out.println(linkedList.get(0)); // 通过索引获取元素} }
- 内部基于链表结构实现,在进行插入和删除操作时效率较高,尤其是在链表的首尾位置进行操作。例如,在实现一个队列或者栈的数据结构时,使用
Set(集合)
- 特点:
- 无序性:元素在
Set
中是没有特定顺序的,每次遍历元素的顺序可能都不一样,不同的实现类具体的存储顺序规则也不同。 - 不可重复性:不允许存在重复的元素,即如果尝试添加一个已经在集合中的元素,添加操作将不会生效。
- 无序性:元素在
- 常见实现类及用法:
HashSet
:- 基于哈希表实现,添加、删除和查询操作的效率通常都比较高。它通过计算元素的哈希值来确定元素在集合中的存储位置,当两个元素的哈希值相同时,会进一步通过
equals
方法来判断是否为同一个元素。例如,存储一组学生的学号,用HashSet
可以保证学号不会重复。示例代码如下:import java.util.HashSet; import java.util.Set;public class HashSetExample {public static void main(String[] args) {Set<String> hashSet = new HashSet<>();hashSet.add("Red");hashSet.add("Blue");hashSet.add("Red"); // 重复元素不会被添加System.out.println(hashSet.contains("Blue")); // 检查元素是否存在} }
- 基于哈希表实现,添加、删除和查询操作的效率通常都比较高。它通过计算元素的哈希值来确定元素在集合中的存储位置,当两个元素的哈希值相同时,会进一步通过
TreeSet
:- 基于红黑树实现,元素会按照自然顺序(如果元素类实现了
Comparable
接口)或者指定的比较器顺序进行排序存储,同时保证元素的不可重复性。例如,存储一组整数并希望它们自动按从小到大的顺序排列,就可以使用TreeSet
。示例代码如下:import java.util.Set; import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {Set<Integer> treeSet = new TreeSet<>();treeSet.add(5);treeSet.add(3);treeSet.add(7);for (Integer num : treeSet) {System.out.println(num); // 元素按顺序输出}} }
- 基于红黑树实现,元素会按照自然顺序(如果元素类实现了
Map(映射)
- 特点:
- 存储键值对:
Map
是一种用于存储键(Key
)和值(Value
)的集合,每个键对应一个唯一的值,通过键可以快速查找、获取对应的的值。 - 键的唯一性:键在同一个
Map
中是不允许重复的,如果添加重复的键,后面添加的值会覆盖前面的值。 - 无序性(一般情况):大部分常见的
Map
实现类,如HashMap
,元素的存储顺序是不固定的,不过也有一些有序的Map
实现类,比如LinkedHashMap
可以保持插入顺序,TreeMap
可以按照键的顺序存储元素。
- 存储键值对:
- 常见实现类及用法:
HashMap
:- 基于哈希表实现,提供了高效的键值对存储和检索功能,是最常用的
Map
实现类。例如,在一个学生信息管理系统中,可以用学生的学号作为键,学生对象(包含姓名、成绩等信息)作为值,方便地进行信息查询和更新。示例代码如下:import java.util.HashMap; import java.util.Map;public class HashMapExample {public static void main(String[] args) {Map<String, String> hashMap = new HashMap<>();hashMap.put("name", "Alice");hashMap.put("age", "20");System.out.println(hashMap.get("name")); // 通过键获取值hashMap.put("name", "Bob"); // 覆盖之前键为"name"的值} }
- 基于哈希表实现,提供了高效的键值对存储和检索功能,是最常用的
LinkedHashMap
:- 继承自
HashMap
,在保持了HashMap
的高效性能的同时,还能按照插入顺序来记录键值对,方便在需要保留操作顺序的场景中使用。例如,记录用户操作的历史记录,以操作的时间戳作为键,操作详情作为值,按照操作发生的先后顺序存储在LinkedHashMap
中。示例代码如下:import java.util.LinkedHashMap; import java.util.Map;public class LinkedHashMapExample {public static void main(String[] args) {Map<String, String> linkedHashMap = new LinkedHashMap<>();linkedHashMap.put("key1", "value1");linkedHashMap.put("key2", "value2");linkedHashMap.put("key3", "value3");for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {System.out.println(entry.getKey() + " : " + entry.getValue());}} }
- 继承自
TreeMap
:- 基于红黑树实现,会按照键的自然顺序(如果键的类型实现了
Comparable
接口)或者指定的比较器顺序来排列键值对,常用于需要对键进行排序查找的场景。例如,统计单词出现的频率,以单词作为键,出现次数作为值,将它们存储在TreeMap
中,就可以按照字母顺序查看单词及对应的频率。示例代码如下:import java.util.Map; import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {Map<String, Integer> treeMap = new TreeMap<>();treeMap.put("apple", 3);treeMap.put("banana", 5);treeMap.put("cherry", 2);for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {System.out.println(entry.getKey() + " : " + entry.getValue());}} }
- 基于红黑树实现,会按照键的自然顺序(如果键的类型实现了
区别总结
比较维度 | List | Set | Map |
---|---|---|---|
元素存储特点 | 有序,可重复 | 无序,不可重复 | 以键值对形式存储,键唯一 |
主要用途 | 适合按顺序存储、频繁通过索引访问元素的场景,如列表展示数据等 | 用于确保元素唯一性的场景,比如去重、判断元素是否存在等 | 用于通过键快速查找对应值的场景,如存储配置信息、映射关系等 |
常见实现类的查询效率对比(大致) | ArrayList 查询快(通过索引),LinkedList 查询相对慢 | HashSet 、TreeSet 查询效率都较高,TreeSet 还能有序输出元素 | HashMap 查询效率高,LinkedHashMap 可保持插入顺序并查询,TreeMap 按键排序后查询 |
常见实现类的插入 / 删除操作效率对比(大致) | ArrayList 中间插入 / 删除慢,首尾相对好一些;LinkedList 首尾插入 / 删除快 | HashSet 插入 / 删除效率高,TreeSet 在维持排序结构下插入 / 删除相对稍慢 | HashMap 插入 / 删除效率高,LinkedHashMap 类似,TreeMap 在维持排序结构下插入 / 删除相对稍慢 |
通过上述对 List
、Set
、Map
的详细介绍和区别分析,可以根据具体的业务需求和性能要求,在 Java 编程中合理地选择和使用相应的集合类型。
相关文章:
List、Set、Map详解和区别
在 Java 中,List、Set、Map是常用的集合类型,它们各自具有不同的特点和用途,以下是对它们的详细介绍及区别分析: List(列表) 特点: 有序性:List中的元素是有序的,即元素…...

界面控件DevExpress WinForms v24.2新功能预览 - 支持.NET 9
DevExpress WinForms 拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…...

Postman之pm.test断言操作
Postman之pm.test断言操作 1.断言方法2.连接符3.条件判断符 用于验证请求的响应数据是否符合预期 1.断言方法 pm.test():定义一个测试函数,接受两个参数,一个字符串参数用来描述该测试,一个返回True/False的函数 语法格式&#…...
对数几率回归
对数几率回归简介 对数几率回归(Logistic Regression)是一种用于解决分类问题的经典统计模型,其核心思想是利用逻辑函数(Sigmoid函数)将线性回归模型的输出值映射到概率范围 [0, 1],从而实现分类预测。对数…...

docker 配置同宿主机共同网段的IP 同时通过通网段的另一个电脑实现远程连接docker
docker配置网络 #宿主机执行命令 ifconfig 查询对应的主机ip 子网掩码 网关地址 #[网卡名称]:inet[主机IP] netmask[子网掩码] broadcast[网关地址]这里需要重点关注:eno1[网卡名称]以及【192.168.31.225】网关地址 在宿主机执行docker命令创建一个虚拟…...
4-7-1.C# 数据容器 - LinkedList(LinkedList 的定义、LinkedList 结点的遍历、LinkedList 的常用方法)
LinkedList 概述 LinkedList<T> 通过节点(Node)来存储数据,每个节点包含数据和指向下一个节点的引用 LinkedList<T> 存储的元素是可重复的 LinkedList<T> 支持泛型,可以指定存储的元素的类型 LinkedList<…...

「三」体验HarmonyOS端云一体化开发模板——使用DevEco Studio直接创建端云一体化工程
关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…...

确保以管理员权限运行 Visual Studio 开发者命令提示符
文章目录 解决方法:1. 以管理员身份运行命令提示符2. 改变目录权限3. 改变项目目录位置4. 检查文件系统权限 总结: ********************************************************************** ** Visual Studio 2022 Developer Command Prompt v17.12.0 …...

命令执行简单(棱角社区有毒)
前言:小迪安全2022第一节反弹shell,小迪用的是两台都是云服务器,没有服务器可以在自己的主机上搭建也是可以的,主机上搭两个网站 思路:生成一个木马文件,下载到本机,然后利用本机上传到目标主机…...

Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程
环境: keil版本为5.38,版本务必高于5.30 STM32F4的pack包版本要高于2.9 软件包下载地址:https://zhuanlan.zhihu.com/p/262507061 一、更改Keil中编译器 更改后编译,会报很多错,先不管。 二、更改头文件依赖 观察…...
Kafka-创建topic源码
一、命令创建topic kafka-topics --create --topic quickstart-events --bootstrap-server cdh1:9092 --partitions 2 --replication-factor 2 二、kafka-topics脚本 exec $(dirname $0)/kafka-run-class.sh org.apache.kafka.tools.TopicCommand "$" 脚本中指定了…...

【网络安全】(一) 0成本添加访问级监控
互联网的安全感这个概念源于阿里。顾名思义,让互联网的用户对于web产品能够产生足够的信任和依赖。特别是涉及到用户资金交易的站点,一次严重的用户资料泄露就可以彻底毁掉你的品牌。 然而当前阶段除了bat大部分互联网行业的企业对于网络安全给的重视都…...

【Three.js基础学习】26. Animated galaxy
前言 shaders实现星系 课程回顾 使用顶点着色器为每个粒子设置动画 a属性 , u制服 ,v变化 像素比:window.devicePixelRatio 自动从渲染器检索像素比 renderer.getPixelRatio() 如何尺寸衰减, 放大缩小视角时,粒子都是同…...
vscode使用ssh配置docker容器环境
1 创建容器,并映射主机和容器的指定ssh服务端口 2 进入容器 docker exec -it <容器ID> /bin/bash 3在容器中安装ssh服务 apt-get update apt-get install openssh-server 接着修改ssh文件信息,将容器的10008端口暴露出来允许root用户使用ssh登录 vim /…...

NLP论文速读(EMNLP 2024)|动态奖励与提示优化来帮助语言模型的进行自我对齐
论文速读|Dynamic Rewarding with Prompt Optimization Enables Tuning-free Self-Alignment of Language Models 论文信息: 简介: 本文讨论的背景是大型语言模型(LLMs)的自我对齐问题。传统的LLMs对齐方法依赖于昂贵的训练和人类偏好注释&am…...
【LeetCode】167. 两数之和 II - 输入有序数组
描述 给定一个下标从 1 开始的整数数组numbers,该数组已按非递减顺序排列,请从数组中找出满足相加之和等于目标数target的两个数。如果这两个数分别是numbers[index1]和numbers[index2],返回整数数组[index1, index2]。 只存在唯一答案&#…...
Getx:GetxController依赖管理02,Binding绑定全局控制器(懒加载Controller)
在使用GetX 状态管理器的时候,如果每个页面都手动实例化一个控制器就太麻烦了, Binding 的作用就是所有需要进行状态管理的控制器进行统一初始化 创建全局控制器Binding import package:get/get.dart; import ../controllers/counter.dart; // 同上一篇内…...
leetcode 找不同
389. 找不同 已解答 简单 相关标签 相关企业 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1: 输入:s "abcd"…...

2025 - 生信信息学 - GEO数据分析 - RF分析(随机森林)
GEO数据分析 - RF分析(随机森林) 01 准备数据文件 #install.packages("randomForest")#引用包 library(randomForest) set.seed(123456)inputFile"diffGeneExp.txt" #输入文件 setwd("/Users/wangyang/Desktop/BCBM/02ra…...

Matlab深度学习(四)——AlexNet卷积神经网络
网络搭建参考:手撕 CNN 经典网络之 AlexNet(理论篇)-CSDN博客 在实际工程应用中,构建并训练一个大规模的卷积神经网络是比较复杂的,需要大量的数据以及高性能的硬件。如果通过训练好的典型网络稍加改进…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...