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

一、Java集合框架总览:一张图搞懂关系

Java集合就像一个“数据容器家族”,主要分为两大类:

  1. Collection(单值集合):存储单个元素,又分为List(有序可重复)、Set(无序不可重复)、Queue(队列)。
  2. Map(键值对集合):存储“键-值”对,如HashMapTreeMap

在这里插入图片描述

二、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,像“字典查单词”。

常用实现类:

  1. HashMap
    • 非线程安全,底层是数组+链表(JDK8后升级为数组+链表+红黑树),增删查改平均O(1),是最常用的Map(比如存储用户ID和用户信息)。
    • 注意:Key不能重复,Value可以重复,Key为null时只能有一个。
  2. LinkedHashMap
    • 继承HashMap,额外用链表维护插入顺序(或访问顺序,比如LRU缓存淘汰策略),适合需要“按顺序遍历键值对”的场景。
  3. TreeMap
    • 元素按Key排序(自然排序或自定义Comparator),适合需要“有序键”的场景(比如按时间顺序存储日志,Key是时间戳)。
  4. Hashtable
    • 古老的线程安全类,所有方法用synchronized加锁,性能差,已过时(除非兼容旧代码,否则用ConcurrentHashMap代替)。
  5. ConcurrentHashMap
    • 并发场景首选!JDK8后底层是数组+红黑树,用分段锁(CAS+ synchronized)实现,支持高并发读写,性能远超Hashtable(比如统计网站实时访问量)。

四、工具类:集合的“辅助工具”

  1. Collections
    • 提供一堆静态方法,比如:
      • Collections.synchronizedList(list):把普通List转为线程安全(通过同步锁,读写互斥)。
      • Collections.unmodifiableList(list):创建不可修改的列表(防止误操作修改数据)。
  2. Arrays
    • 数组转集合:List<String> list = Arrays.asList("a", "b")(注意:返回的是固定大小的列表,不能增删)。
  3. BitSet
    • 特殊集合,用位(bit)存储布尔值,适合海量数据的去重或状态标记(比如统计1亿个用户ID是否存在,比HashSet省内存)。

五、如何选择合适的集合类?看场景!

需求推荐集合类原因
单线程、频繁查询ArrayList、HashMap数组/哈希表结构,查询速度快
单线程、频繁增删(头尾)LinkedList、ArrayDeque链表/双向队列,头尾增删O(1)
去重且无序HashSet哈希表去重,性能最优
去重且按插入顺序LinkedHashSet链表维护顺序,兼顾去重和顺序
排序且去重TreeSet、TreeMap自动排序,适合需要顺序的场景
多线程读多写少CopyOnWriteArrayList、ConcurrentHashMap读无锁/分段锁,减少锁竞争
多线程读写均衡SynchronizedList、Hashtable(不推荐)同步锁保证线程安全,但性能较差,新代码优先用ConcurrentHashMap
队列(先进先出)ArrayDeque(非阻塞)、BlockingQueue(阻塞)高性能队列,适合任务调度、生产者-消费者模式

六、总结:3分钟记住核心知识点

  1. List:有序可重复,ArrayList(数组)和LinkedList(链表)是主力,线程安全用CopyOnWriteArrayList
  2. Set:无序不可重复,HashSet(最快)、LinkedHashSet(保顺序)、TreeSet(可排序)。
  3. Map:键值对,HashMap(常用)、LinkedHashMap(保顺序)、ConcurrentHashMap(并发首选)。
  4. Queue:队列,ArrayDeque(普通队列)、PriorityQueue(优先级)、BlockingQueue(并发阻塞队列)。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值