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博客 在实际工程应用中,构建并训练一个大规模的卷积神经网络是比较复杂的,需要大量的数据以及高性能的硬件。如果通过训练好的典型网络稍加改进…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...