当前位置: 首页 > article >正文

【Java入门|集合全解析:List、Set与Map详解】

Java集合Java集合分为单列集合和双列集合也就是 Collection 和 Map 。顾名思义 Collection 一个位置上仅存放一个元素 Map 一个位置上有两个元素分为键和值。 Map 和 Collection 下又分别衍生出多种集合种类下面笔者将一一介绍。一、Collection单列集合体系Collection 是单列集合的根接口它定义了所有单列集合的通用方法比如 add() 、 remove() 、 contains() 、 size() 等。它主要有两个子接口 List 和 Set 二者的核心区别在于 List 是有序、可重复的集合 Set 是无序、不可重复的集合。1. List 子接口List 代表有序、可重复的集合集合中的元素有明确的索引支持通过索引快速访问并且可以存储重复元素。- ArrayList基于动态数组实现是最常用的List实现类。它的查询效率极高通过索引直接定位但在中间插入、删除元素时需要移动后续元素效率较低线程不安全适合读多写少的场景。import java.util.ArrayList; import java.util.List; public class ArrayListDemo { public static void main(String[] args) { // 初始化ArrayList ListString list new ArrayList(); // 添加元素 list.add(Java); list.add(Python); list.add(Java); // 允许重复 // 根据索引获取元素 System.out.println(list.get(0)); // 输出: Java // 删除元素 list.remove(Python); // 遍历集合 for (String s : list) { System.out.println(s); // 输出: Java、Java } // 获取集合大小 System.out.println(集合大小 list.size()); // 输出: 2 } }- LinkedList基于双向链表实现在集合的首尾进行插入、删除操作效率极高但查询元素需要遍历链表效率较低同样线程不安全适合写多读少的场景同时还实现了 Deque 接口可以作为栈、队列、双端队列使用。import java.util.LinkedList; import java.util.List; import java.util.Queue; public class LinkedListDemo { public static void main(String[] args) { // 作为List使用 ListString list new LinkedList(); list.add(A); list.add(B); // 作为队列使用FIFO QueueString queue new LinkedList(); queue.offer(C); queue.offer(D); System.out.println(queue.poll()); // 输出: C出队 // 作为栈使用LIFO LinkedListString stack new LinkedList(); stack.push(E); stack.push(F); System.out.println(stack.pop()); // 输出: F出栈 } }- Vector早期的List实现类基于动态数组和ArrayList类似但它的方法都加了 synchronized 修饰线程安全但性能远低于ArrayList现在基本不再使用。import java.util.Vector; public class VectorDemo { public static void main(String[] args) { VectorInteger vector new Vector(); vector.add(1); vector.add(2); System.out.println(vector.get(0)); // 输出: 1 } }- Stack继承自Vector是栈的实现类遵循“后进先出LIFO”原则同样线程安全但性能差现在更推荐用 Deque 实现栈的功能。2. Set 子接口Set 代表无序、不可重复的集合集合中的元素没有索引不允许存储重复元素重复元素会被覆盖。- HashSet基于HashMap实现是最常用的Set实现类。它的底层是哈希表查询、插入、删除的效率都很高但不保证元素的顺序线程不安全。import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; public class HashSetDemo { public static void main(String[] args) { // HashSet无序去重 SetString set new HashSet(); set.add(Java); set.add(Python); set.add(Java); // 重复元素不会被添加 System.out.println(set); // 输出: [Java, Python]顺序不固定 // LinkedHashSet有序去重保留插入顺序 SetString linkedSet new LinkedHashSet(); linkedSet.add(Java); linkedSet.add(Python); linkedSet.add(C); System.out.println(linkedSet); // 输出: [Java, Python, C] } }它的子类 LinkedHashSet 基于哈希表双向链表实现既保留了HashSet的高效操作又能保证元素的插入顺序适合需要既去重又保留顺序的场景。- TreeSet基于TreeMap实现底层是红黑树它会对存储的元素进行自然排序或自定义比较器排序因此可以按照指定顺序遍历元素线程不安全适合需要排序的去重场景。import java.util.Set; import java.util.TreeSet; public class TreeSetDemo { public static void main(String[] args) { // 自然排序Integer默认升序 SetInteger set new TreeSet(); set.add(3); set.add(1); set.add(2); System.out.println(set); // 输出: [1, 2, 3] // 自定义排序字符串长度排序 SetString customSet new TreeSet((s1, s2) - s1.length() - s2.length()); customSet.add(Java); customSet.add(Python); customSet.add(C); System.out.println(customSet); // 输出: [C, Java, Python] } }- EnumSet专门为枚举类型设计的Set实现类基于位运算实现性能极高所有元素必须是指定枚举类型的枚举值线程不安全。二、Map双列集合体系Map 是双列集合的根接口存储的是键Key-值Value映射关系其中键不可重复值可以重复每个键最多对应一个值。它的核心方法有 put() 、 get() 、 remove() 、 containsKey() 、 keySet() 等。1. 常用Map实现类- HashMap基于哈希表JDK 8后为数组链表红黑树实现是最常用的Map实现类。它的查询、插入、删除效率极高键允许为 null 值也允许为 null 线程不安全适合高并发读多写少的场景。import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; public class HashMapDemo { public static void main(String[] args) { // HashMap无序 MapString, Integer map new HashMap(); map.put(Java, 1); map.put(Python, 2); map.put(Java, 3); // 键重复会覆盖旧值 System.out.println(map.get(Java)); // 输出: 3 // 遍历MapkeySet for (String key : map.keySet()) { System.out.println(key : map.get(key)); } // 遍历MapentrySet效率更高 for (Map.EntryString, Integer entry : map.entrySet()) { System.out.println(entry.getKey() : entry.getValue()); } // LinkedHashMap保留插入顺序 MapString, Integer linkedMap new LinkedHashMap(); linkedMap.put(A, 1); linkedMap.put(B, 2); linkedMap.put(C, 3); System.out.println(linkedMap); // 输出: {A1, B2, C3} } }它的子类 LinkedHashMap 基于哈希表双向链表实现既保留了HashMap的高效操作又能保证元素的插入顺序适合需要既高效又保留插入顺序的场景。- TreeMap基于红黑树实现会对键进行自然排序或自定义比较器排序可以按照键的顺序遍历元素键不允许为 null 除非自定义比较器支持线程不安全适合需要按键排序的场景。import java.util.Map; import java.util.TreeMap; public class TreeMapDemo { public static void main(String[] args) { // 自然排序String默认字典序 MapString, Integer map new TreeMap(); map.put(Java, 1); map.put(Python, 2); map.put(C, 3); System.out.println(map); // 输出: {C3, Java1, Python2} // 自定义排序按键长度排序 MapString, Integer customMap new TreeMap((k1, k2) - k1.length() - k2.length()); customMap.put(Java, 1); customMap.put(Python, 2); customMap.put(C, 3); System.out.println(customMap); // 输出: {C3, Java1, Python2} } }- Hashtable早期的Map实现类基于哈希表方法都加了 synchronized 修饰线程安全但性能远低于HashMap键和值都不允许为 null 现在基本不再使用。- ConcurrentHashMap线程安全的HashMap替代类JDK 8后基于CASsynchronized哈希表实现在高并发场景下性能远高于Hashtable键和值都不允许为 null 是高并发场景下的首选Map实现。import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class ConcurrentHashMapDemo { public static void main(String[] args) { MapString, Integer map new ConcurrentHashMap(); map.put(A, 1); map.put(B, 2); // 多线程环境下安全操作 new Thread(() - map.put(C, 3)).start(); new Thread(() - System.out.println(map.get(A))).start(); } }- EnumMap专门为枚举类型设计的Map实现类键必须是指定枚举类型的枚举值基于数组实现性能极高线程不安全。- Properties继承自Hashtable专门用于处理配置文件键和值都是 String 类型常用于读取 .properties 配置文件线程安全。import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; public class PropertiesDemo { public static void main(String[] args) throws Exception { Properties prop new Properties(); // 加载配置文件 prop.load(new FileInputStream(config.properties)); // 获取配置项 String url prop.getProperty(db.url); System.out.println(url); // 修改并保存配置 prop.setProperty(db.user, root); prop.store(new FileOutputStream(config.properties), update config); } }三、集合工具类与使用注意事项1. 工具类- Collections针对 Collection 、 List 、 Set 、 Map 的工具类提供了排序 sort() 、洗牌 shuffle() 、同步化 synchronizedList() 等、不可修改集合 unmodifiableList() 等等静态方法。import java.util.ArrayList; import java.util.Collections; import java.util.List; public class CollectionsDemo { public static void main(String[] args) { ListInteger list new ArrayList(); list.add(3); list.add(1); list.add(2); // 排序 Collections.sort(list); System.out.println(list); // 输出: [1, 2, 3] // 洗牌随机打乱 Collections.shuffle(list); // 同步化线程安全 ListInteger syncList Collections.synchronizedList(list); // 不可修改集合 ListInteger unmodList Collections.unmodifiableList(list); // unmodList.add(4); // 会抛出UnsupportedOperationException } }- Arrays针对数组的工具类提供了数组转集合 asList() 、排序、二分查找等方法注意 asList() 返回的是固定长度的集合不能进行增删操作。import java.util.Arrays; import java.util.List; public class ArraysDemo { public static void main(String[] args) { // 数组转集合注意返回的是固定长度集合不能增删 ListString list Arrays.asList(A, B, C); // 数组排序 int[] arr {3, 1, 2}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 3] } }2. 线程安全问题- 大部分集合ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的在多线程环境下直接使用会出现数据不一致问题。- 可以通过 Collections.synchronizedXxx() 方法将非线程安全集合转为线程安全集合也可以直接使用线程安全集合如 Vector 、 Hashtable 、 ConcurrentHashMap 。3. 迭代器与快速失败fail-fast- 集合的迭代器 Iterator 是遍历集合的标准方式在遍历过程中如果直接修改集合如 add() 、 remove() 会触发 ConcurrentModificationException 快速失败机制如果需要在遍历时删除元素需要使用迭代器的 remove() 方法。四、总结Java集合体系可以总结为- 单列集合Collection List 有序可重复ArrayList/LinkedList、 Set 无序不可重复HashSet/TreeSet- 双列集合Map HashMap 高效无顺序、 TreeMap 按键排序、 ConcurrentHashMap 高并发线程安全- 工具类 Collections 、 Arrays集合类型选型场景推荐实现类单列-有序可重复读多写少ArrayList单列-有序可重复写多读少、首尾操作频繁LinkedList单列-无序去重普通去重HashSet单列-有序去重去重且保留插入顺序/排序LinkedHashSet/TreeSet双列-键值对普通存储HashMap双列-键值对保留插入顺序LinkedHashMap双列-键值对按键排序TreeMap双列-键值对高并发场景ConcurrentHashMap*在实际开发中需要根据业务场景选择合适的集合读多写少选ArrayList写多读少选LinkedList去重选HashSet排序选TreeSet键值对存储选HashMap高并发选ConcurrentHashMap。

相关文章:

【Java入门|集合全解析:List、Set与Map详解】

Java集合Java集合分为单列集合和双列集合,也就是 Collection 和 Map 。顾名思义, Collection 一个位置上仅存放一个元素; Map 一个位置上有两个元素(分为键和值)。 Map 和 Collection 下又分别衍生出多种集合种类&…...

晶振参数深度解读与替代选型实战(55.2MHz 工业级无源晶振案例)

前言作为嵌入式 / 硬件 FAE,日常工作中晶振的参数解读、客户需求替代是高频场景。最近遇到一个典型的工业级宽温晶振客户需求,参数里藏着很多新手容易踩的坑,比如 “负频率” 的误解、负载电容不匹配、宽温范围忽略等问题。本文以客户的55.2M…...

Android 开发问题:It‘s possible to extract method returning XXX from a long surrounding...

在 Android 开发中,Android Studio 出现如下提示信息 Its possible to extract method returning TakeCardRecordListDTO from a long surrounding method# 解读可以从长方法中提取返回“TakeCardRecordListDTO”的方法问题原因这段提示是提取方法重构策略&#xff…...

推客系统开发|企业私域裂变刚需,低成本自动获客变现

公域投流成本居高不下、流量转化疲软,当下多数商家、企业都在转型私域运营。推客系统凭借低成本裂变、自动化运营、高留存等优势,成为企业盘活自有流量、实现自主拓客的核心工具。一、专属定制开发,适配各类业态支持个性化定制,自…...

别再只问哪个大模型更强了,2026年真正决定AI Agent上限的,是向量引擎

别再只问哪个大模型更强了,2026年真正决定AI Agent上限的,是向量引擎 这两年做AI的人,最容易掉进一个坑。 每天盯着模型榜单看。 今天这个模型会写代码了。 明天那个模型会看视频了。 后天又有一个模型说自己推理能力更强了。 看久了以后&…...

别再傻等!EPLAN部件库导入太慢?试试这个解压导入法,效率翻倍

EPLAN部件库高效导入实战:解压法与便携式部署全解析 电气工程师们对EPLAN的部件库导入速度缓慢一定深有体会——当你拿到一个几百兆的EDZ文件,点击导入后泡杯咖啡回来可能进度条才走了一半。这种等待不仅浪费时间,更会打断工作节奏。本文将彻…...

从“黑盒”到“白盒”:深入理解PHP伪协议php://input的底层机制与安全开发启示

从“黑盒”到“白盒”:深入理解PHP伪协议php://input的底层机制与安全开发启示 在Web安全领域,文件包含漏洞一直是攻击者青睐的攻击向量。而PHP伪协议php://input的巧妙利用,往往能让看似无害的文件包含操作演变为致命的远程代码执行漏洞。本…...

Zotero安装后必做的5件事:从浏览器抓取到PDF重命名,新手避坑指南

Zotero安装后必做的5件事:从浏览器抓取到PDF重命名,新手避坑指南 第一次打开Zotero时,面对空荡荡的界面和密密麻麻的菜单选项,很多科研新手都会感到无从下手。作为一款功能强大的开源文献管理工具,Zotero的真正价值往往…...

Microchip安卓配件开发平台:MCU与安卓系统高效协同实战指南

1. 项目概述:当单片机巨头拥抱安卓生态作为一名在嵌入式领域摸爬滚打了十几年的老工程师,我经历过从8位机到32位ARM,再到各种RTOS的变迁。但最近几年,一个趋势越来越明显:越来越多的智能设备,特别是那些需要…...

拓璞数控港股上市:市值142亿港元 年营收5.8亿,净利163万

雷递网 雷建平 5月20日上海拓璞数控科技股份有限公司(简称:“拓璞数控”,股票代码:“07688”)今日在港交所上市。拓璞数控此次发售6533万股,发售价26.39港元,募资总额为17.24亿港元;…...

港科大沈劭劼、谭平团队最新成果:开源280万全景数据集,实现零样本立体匹配

「一举攻克全景3D视觉两大瓶颈」 目录 01 行业痛点:数据匮乏与畸变失效的双重桎梏 1. 数据集稀缺,泛化能力受限 2. 球面畸变破坏单目先验一致性 02 核心突破:超大数据与航向对齐先验双驱动 1. 280万级合成数据集,打破数据壁…...

保姆级教程:在S32G274ARDB2上,用IPCF点亮RGB LED(附源码解析)

从零玩转S32G2核间通信:手把手实现IPCF控制RGB灯效 拿到S32G274A开发板的第一天,我就被那个三色RGB LED吸引了——这不仅是硬件调试的指示灯,更是验证核间通信的绝佳媒介。作为多核异构处理器,S32G2的A53与M7核心如何协同工作&…...

基于PSoC 6与BMI160构建嵌入式IMU测试系统:从驱动到上位机全流程

1. 项目概述:从一颗传感器到一个完整的测试系统最近在做一个嵌入式项目,需要用到一款高性能的惯性测量单元(IMU)——博世的BMI160。这颗芯片在消费电子和物联网领域很常见,三轴加速度计加三轴陀螺仪,精度和…...

告别MPU6050例程!ATK-IMU901与Arduino串口通信的3个关键避坑点

ATK-IMU901与Arduino串口通信的实战避坑指南 当你从MPU6050切换到ATK-IMU901时,可能会发现原本顺畅的代码突然"罢工"了。这不是你的错——这两款IMU模块在设计理念上存在本质差异。本文将带你深入理解ATK-IMU901的通信机制,避开三个最常见的移…...

cp520靶场学习笔记

正文1、端口扫描2、web登录页面用户密码爆破3、文件上传漏洞利用4、nc 反弹5、Linux用户检索与特权分析6、图片隐写7、解密与格式转换8、cp命令横向获取用户密码9、diff命令进行文件比较正文 kali攻击机地址:192.168.1.4 靶场地址:192.168.1.15 1、端口…...

AOCODARC-F7MINI飞控固件编译踩坑记:从‘make arm_sdk_install’失败到成功编译

AOCODARC-F7MINI飞控固件编译实战:从工具链安装到烧录全流程解析 1. 环境准备与工具链安装 编译BetaFlight固件最令人头疼的环节往往不是代码本身,而是环境配置。以Ubuntu 20.04为例,我们需要先解决两个核心问题:基础编译环境和AR…...

C++ STL常用函数一览表(快速记忆版本)

C STL 常用数据结构与函数整理 这份笔记按常见 STL 容器分类整理&#xff0c;适合在刷题和复习时快速查阅。1. vector 1.1 特点 底层是动态数组支持随机访问尾部插入、删除效率高中间插入、删除效率低 1.2 常用定义 vector<int> v; vector<int> v(5); /…...

不止是省9.9刀:解锁特斯拉Model 3的‘行驶中保持WiFi’功能,打造家庭移动娱乐中心

不止是省9.9刀&#xff1a;解锁特斯拉Model 3的‘行驶中保持WiFi’功能&#xff0c;打造家庭移动娱乐中心 特斯拉Model 3的车载4G网络虽然方便&#xff0c;但在信号不佳的区域或需要大流量娱乐的场景下&#xff0c;往往显得力不从心。更让许多家庭用户纠结的是&#xff0c;高级…...

STM32 HAL库驱动中景园0.96寸OLED(SSD1306)避坑指南:从IIC地址到GRAM刷新的完整流程

STM32 HAL库驱动中景园0.96寸OLED&#xff08;SSD1306&#xff09;全流程实战解析 在嵌入式开发中&#xff0c;OLED显示屏因其高对比度、低功耗和快速响应等特性&#xff0c;成为许多项目的首选显示方案。本文将深入探讨如何基于STM32 HAL库高效驱动中景园0.96寸OLED&#xff0…...

Kimi、DeepSeek、阶跃星辰三天融资超百亿,中国AI的“中场战事”刚刚开始

过去一周&#xff0c;融资狂潮、智能体大军与算力基建三大赛道同时开火&#xff0c;天平正在加速倾斜。大模型调用量&#xff1a;连续三周&#xff0c;中国AI压住美国5月18日&#xff0c;根据OpenRouter最新数据&#xff0c;2026年5月11日至17日当周&#xff0c;全球AI大模型总…...

未来5年,程序员换工作,请做好降薪准备!

最近看到不少大厂的去年和一季度财报都公布了&#xff0c;不少人年终奖也发的差不多了&#xff0c;再加上金三银四也过了有一段时间了。按理来说&#xff0c;该晋升的晋升&#xff0c;该跳槽的跳槽&#xff0c;该加薪的加薪&#xff0c;基本尘埃落定&#xff0c;我公号后台应该…...

API 监控告警系统

LogMonitor - API监控告警系统 基于Python的智能API监控系统&#xff0c;集成Splunk日志分析和钉钉告警&#xff0c;支持多种API类型的实时监控和趋势分析。 代码地址 https://github.com/junbingliu007/log_monitor 功能特性 多API类型监控&#xff1a;支持多种API类型智…...

Midjourney × CLO 3D无缝协同方案(工业级打版前必读):实现AI草图→虚拟缝合→力学模拟零损转换

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Midjourney CLO 3D无缝协同方案&#xff08;工业级打版前必读&#xff09;&#xff1a;实现AI草图→虚拟缝合→力学模拟零损转换 在高精度服装数字样衣开发流程中&#xff0c;Midjourney生成的创意草图常因缺…...

企业级RAG系统数据可信生死线:Perplexity验证功能内测权限仅剩最后17个——附白名单申请通道

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;企业级RAG系统数据可信生死线&#xff1a;Perplexity验证功能内测权限仅剩最后17个——附白名单申请通道 在企业级RAG&#xff08;Retrieval-Augmented Generation&#xff09;系统中&#xff0c;检索结果与生…...

有这5个迹象,说明你公司内斗很严重!

见字如面&#xff0c;我是军哥&#xff01;昨天&#xff0c;一位读者小王给我留言。他在某大厂担任项目经理&#xff0c;最近工作推进得很艰难。同一件事开了好几次会&#xff0c;领导就是不拍板。跨部门协作费力不讨好&#xff0c;谁都不愿负责&#xff0c;项目卡在那里没有进…...

光纤干涉条纹投射导向的动态三维形貌测量技术【附程序】

✨ 长期致力于条纹投射轮廓术、光纤干涉条纹投射、正弦相位调制、任意步距相移相位解调、系统标定研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;基于…...

Dify系列课程 - 5.Ollama:轻松驾驭本地大语言模型(在 Windows 上安装 Ollama 并部署 DeepSeek 大模型)

Ollama 安装Deepseek大模型 Ollama 大模型安装完成...

勒索病毒防线与数据恢复能力:四家云厂商安全水位线横向测评

对于制造业等行业的内部核心业务&#xff08;MES、WMS、ERP、HIS等&#xff09;上云&#xff0c;深信服托管云凭借其“资源专属全栈托管主动服务”三位一体的模式&#xff0c;在业务连续性保障、就近部署低时延以及贴身服务响应等方面&#xff0c;表现出比主流公有云方案更强的…...

序列近似整数规划导向的通用高性能离散变量拓扑优化新方法【附算法】

✨ 长期致力于拓扑优化、整数规划、序列近似规划、信赖域、拓扑不变量研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;正则松弛算法求解大规模可分离整…...

脉冲神经网络与测试时自适应技术解析

1. 脉冲神经网络与测试时自适应概述脉冲神经网络&#xff08;Spiking Neural Networks, SNNs&#xff09;作为第三代神经网络模型&#xff0c;其核心在于模拟生物神经元的脉冲发放机制。与传统人工神经网络不同&#xff0c;SNN中的神经元仅在膜电位达到特定阈值时才产生脉冲信号…...