一文搞懂Java集合类:从List到Map,分类、特点、使用场景全解析

一文搞懂Java集合类:从List到Map,分类、特点、使用场景全解析

一、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 list = Arrays.asList("a", "b")(注意:返回的是固定大小的列表,不能增删)。

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(并发阻塞队列)。

根据“数据是否需要顺序、是否允许重复、是否多线程、读写频率”来选,再也不怕选错啦! 😊

相关推荐

荒野行动直升飞机在哪里(幽灵行动荒野直升机位置)
best365官网手机版

荒野行动直升飞机在哪里(幽灵行动荒野直升机位置)

📅 07-10 👁️ 6074
情人节给男生送什么花 适合送男生的花
bet体育365官网怎么样

情人节给男生送什么花 适合送男生的花

📅 08-13 👁️ 8004
撐的意思,撐的解释,撐的拼音,撐的部首,撐的笔顺
best365官网手机版

撐的意思,撐的解释,撐的拼音,撐的部首,撐的笔顺

📅 08-03 👁️ 2181
机器人的洪流:刷库、撞库那些事儿
365官网哪个是真的

机器人的洪流:刷库、撞库那些事儿

📅 07-17 👁️ 7881
16女生正常胸围是多少
bet体育365官网怎么样

16女生正常胸围是多少

📅 07-25 👁️ 1950
天天酷跑饰品一览 花开和扑克到底谁更强
bet体育365官网怎么样

天天酷跑饰品一览 花开和扑克到底谁更强

📅 08-03 👁️ 8531