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