一、Java集合框架总览:一张图搞懂关系
Java集合就像一个“数据容器家族”,主要分为两大类:
- Collection(单值集合):存储单个元素,又分为
List
(有序可重复)、Set
(无序不可重复)、Queue
(队列)。 - Map(键值对集合):存储“键-值”对,如
HashMap
、TreeMap
。
二、Collection家族:单值数据的“收纳盒”
1. List:有序、可重复(元素有顺序,允许重复)
- 特点:可以通过索引(下标)访问元素,像“带顺序的篮子”。
- 常用实现类:
- ArrayList:
- 底层是数组,查询快(按索引找元素像“直接翻到课本某一页”),增删慢(插入/删除元素可能需要移动后面所有元素)。
- 非线程安全,适合单线程或并发读少的场景(比如用户订单列表)。
- LinkedList:
- 底层是双向链表,增删快(插入/删除只需改指针,像“在链表中间插一张纸”),查询慢(找元素要从头开始遍历)。
- 非线程安全,适合频繁增删的场景(比如聊天消息队列)。
- Vector:
- 古老的线程安全类,和
ArrayList
功能类似,但所有方法用synchronized
加锁,性能差,已过时(除非兼容旧代码,否则别用)。
- 古老的线程安全类,和
- CopyOnWriteArrayList:
- 并发场景专用!写操作时复制数组(“写时复制”),读操作无锁,适合读多写少(比如配置列表,启动后很少修改)。
- ArrayList:
2. Set:无序、不可重复(元素无顺序,不能重复)
- 特点:自动去重,像“去重的袋子”,常用作“判断某个元素是否存在”(比
List
快很多)。 - 常用实现类:
- HashSet:
- 底层是
HashMap
(存元素时用键,值是一个固定对象),基于哈希表,增删查速度极快(平均O(1)),但元素无序(插入顺序和取出顺序可能不同)。
- 底层是
- LinkedHashSet:
- 继承
HashSet
,额外用链表维护插入顺序,元素有序(按插入顺序排列),适合需要“去重且保留顺序”的场景(比如统计用户访问过的页面,按访问顺序记录)。
- 继承
- TreeSet:
- 底层是
TreeMap
,元素按排序规则(自然排序或自定义Comparator)有序,适合需要“排序去重”的场景(比如学生成绩排名,自动去重并按分数从高到低排列)。
- 底层是
- HashSet:
3. Queue:队列,先进先出(FIFO)
- 特点:像“排队买票”,先加入的元素先取出,新增方法有
add()
/offer()
,取元素用poll()
/remove()
。 - 常用实现类:
- ArrayDeque:
- 底层是数组,支持双向队列(头尾都能增删),性能比
LinkedList
好,推荐优先用它代替LinkedList
作为队列。
- 底层是数组,支持双向队列(头尾都能增删),性能比
- PriorityQueue:
- 优先级队列,取出元素时按优先级排序(比如任务队列,高优先级任务先执行),底层是堆结构。
- BlockingQueue(接口):
- 并发专用队列,支持阻塞操作:没元素时
take()
会等待,满了时put()
会等待,常用于生产者-消费者模式(比如线程池的任务队列)。
- 并发专用队列,支持阻塞操作:没元素时
- ArrayDeque:
三、Map家族:键值对的“字典”
特点:每个元素是“键-值”对(Key-Value),通过Key快速找Value,像“字典查单词”。
常用实现类:
- HashMap:
- 非线程安全,底层是数组+链表(JDK8后升级为数组+链表+红黑树),增删查改平均O(1),是最常用的Map(比如存储用户ID和用户信息)。
- 注意:Key不能重复,Value可以重复,Key为
null
时只能有一个。
- LinkedHashMap:
- 继承
HashMap
,额外用链表维护插入顺序(或访问顺序,比如LRU缓存淘汰策略),适合需要“按顺序遍历键值对”的场景。
- 继承
- TreeMap:
- 元素按Key排序(自然排序或自定义Comparator),适合需要“有序键”的场景(比如按时间顺序存储日志,Key是时间戳)。
- Hashtable:
- 古老的线程安全类,所有方法用
synchronized
加锁,性能差,已过时(除非兼容旧代码,否则用ConcurrentHashMap
代替)。
- 古老的线程安全类,所有方法用
- ConcurrentHashMap:
- 并发场景首选!JDK8后底层是数组+红黑树,用分段锁(CAS+ synchronized)实现,支持高并发读写,性能远超
Hashtable
(比如统计网站实时访问量)。
- 并发场景首选!JDK8后底层是数组+红黑树,用分段锁(CAS+ synchronized)实现,支持高并发读写,性能远超
四、工具类:集合的“辅助工具”
- Collections:
- 提供一堆静态方法,比如:
Collections.synchronizedList(list)
:把普通List
转为线程安全(通过同步锁,读写互斥)。Collections.unmodifiableList(list)
:创建不可修改的列表(防止误操作修改数据)。
- 提供一堆静态方法,比如:
- Arrays:
- 数组转集合:
List<String> list = Arrays.asList("a", "b")
(注意:返回的是固定大小的列表,不能增删)。
- 数组转集合:
- BitSet:
- 特殊集合,用位(bit)存储布尔值,适合海量数据的去重或状态标记(比如统计1亿个用户ID是否存在,比
HashSet
省内存)。
- 特殊集合,用位(bit)存储布尔值,适合海量数据的去重或状态标记(比如统计1亿个用户ID是否存在,比
五、如何选择合适的集合类?看场景!
需求 | 推荐集合类 | 原因 |
---|---|---|
单线程、频繁查询 | ArrayList、HashMap | 数组/哈希表结构,查询速度快 |
单线程、频繁增删(头尾) | LinkedList、ArrayDeque | 链表/双向队列,头尾增删O(1) |
去重且无序 | HashSet | 哈希表去重,性能最优 |
去重且按插入顺序 | LinkedHashSet | 链表维护顺序,兼顾去重和顺序 |
排序且去重 | TreeSet、TreeMap | 自动排序,适合需要顺序的场景 |
多线程读多写少 | CopyOnWriteArrayList、ConcurrentHashMap | 读无锁/分段锁,减少锁竞争 |
多线程读写均衡 | SynchronizedList、Hashtable(不推荐) | 同步锁保证线程安全,但性能较差,新代码优先用ConcurrentHashMap |
队列(先进先出) | ArrayDeque(非阻塞)、BlockingQueue(阻塞) | 高性能队列,适合任务调度、生产者-消费者模式 |
六、总结:3分钟记住核心知识点
- List:有序可重复,
ArrayList
(数组)和LinkedList
(链表)是主力,线程安全用CopyOnWriteArrayList
。 - Set:无序不可重复,
HashSet
(最快)、LinkedHashSet
(保顺序)、TreeSet
(可排序)。 - Map:键值对,
HashMap
(常用)、LinkedHashMap
(保顺序)、ConcurrentHashMap
(并发首选)。 - Queue:队列,
ArrayDeque
(普通队列)、PriorityQueue
(优先级)、BlockingQueue
(并发阻塞队列)。
根据“数据是否需要顺序、是否允许重复、是否多线程、读写频率”来选,再也不怕选错啦! 😊