java容器 LIst、set、Map

Java容器中的List、Set、Map是核心数据结构,各自适用于不同的场景

一、List(有序、可重复)

List接口代表有序集合,允许元素重复和通过索引访问,主要实现类包括:

ArrayList

底层结构:动态数组实现。

特点:支持快速随机访问(时间复杂度O(1)),但插入/删除元素时需要移动数组,效率较低(时间复杂度O(n))。

适用场景:读多写少,需频繁按索引查询的场景,如数据缓存。

LinkedList

底层结构:双向链表实现。

特点:插入/删除效率高(时间复杂度O(1)),但随机访问效率低(需遍历链表,时间复杂度O(n))。

扩展功能:可用作栈(push/pop)或队列(offer/poll)。

Vector & Stack

线程安全:通过synchronized实现同步,但性能较低,已被CopyOnWriteArrayList取代。

Stack:基于数组的栈结构,但官方推荐用Deque接口替代。

CopyOnWriteArrayList

并发安全:写操作时复制新数组,读操作无锁,适合读多写少的高并发场景。

缺点:内存占用高,数据可能延迟更新。

二、Set(无序、不可重复)

Set接口要求元素唯一性,主要实现类包括:

HashSet

底层结构:基于HashMap实现,哈希表存储元素。

特点:插入/查询效率高(时间复杂度O(1)),元素无序。

LinkedHashSet

扩展特性:维护插入顺序的双向链表,适合需要保持顺序的集合。

TreeSet

底层结构:基于红黑树实现,元素按自然顺序或自定义比较器排序。

特点:插入/查询效率较低(时间复杂度O(log n)),但支持范围查询。

CopyOnWriteArraySet

并发安全:基于CopyOnWriteArrayList,通过addIfAbsent保证元素唯一性。

三、Map(键值对存储)

Map接口存储键值对(Key-Value),键唯一,主要实现类包括:

HashMap

底层结构:数组+链表/红黑树(JDK8优化冲突处理)。

特点:非线程安全,允许null键/值,查询效率高(平均O(1))。

LinkedHashMap

扩展特性:维护插入顺序或LRU(最近最少使用)顺序。

TreeMap

底层结构:红黑树实现,键按自然顺序或自定义排序。

适用场景:需有序遍历键的场景,如排序字典。

ConcurrentHashMap

并发优化:JDK8后采用CAS和分段锁,替代Hashtable。

特点:高并发下性能优于同步容器,适合多线程环境。

HashTable

遗留类:全表锁导致性能低,不推荐使用

四、场景应用

容器 有序性 重复性 线程安全 典型应用场景
ArrayList 是(插入顺序) 允许 否(需并发容器) 高频随机访问的静态数据
LinkedList 是(插入顺序) 允许 否 频繁插入/删除的队列或栈
HashSet 否 禁止 否(需并发容器) 快速去重的无序集合
TreeSet 是(自然排序) 禁止 否 需要排序或范围查询的集合
HashMap 否 键唯一 否(需ConcurrentHashMap) 高频键值查询的非同步场景
ConcurrentHashMap 否 键唯一 是(分段锁/CAS) 高并发键值存储

五、设计模式与底层原理

迭代器模式:所有容器均实现Iterable接口,通过Iterator遍历元素,支持forEach循环。

适配器模式:如Arrays.asList()将数组适配为List。

写时复制:CopyOnWriteArrayList通过复制新数组实现并发安全,减少锁竞争。

实际使用根据业务场景决定。

相关推荐
2601_966949651 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨3 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪4 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风4 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
文丑颜不良啊5 小时前
LeetCode876~900题目解析
java·leetcode
aloha_7895 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
知守观6 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
2601_962885726 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
独隅6 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友