Skip to content

Java 中有哪些集合类?请简单介绍 ​

  • 标签:Java 集合、Java

🏛 业务架构师 ​

Java 集合体系我习惯按业务数据访问模式来归类,而不是背类名:

  • List 有序可重复:ArrayList 基于数组,随机访问快,是业务列表展示(订单列表、商品列表)的默认选择;LinkedList 基于双向链表,随机访问慢,实际业务很少用,别被"增删快"误导——按索引增删照样要遍历;
  • Map 按 key 存取:HashMap 无序、TreeMap 有序(按 key 排序,适合区间查询如价格区间)、LinkedHashMap 保序且支持 LRU 淘汰(本地缓存的标准实现);并发场景统一 ConcurrentHashMap;
  • Set 去重:HashSet 基于 HashMap,做标签去重、抽奖名单判重;LinkedHashSet 保插入序;TreeSet 支持有序去重;
  • Queue/Deque 队列:业务削峰、任务缓冲的载体,并发场景用 ArrayBlockingQueue、LinkedBlockingQueue,延时任务用 DelayQueue。

我的选型心法是三问:业务要按什么方式访问(索引、key、顺序)、是否要去重、是否多线程共享。绝大多数业务事故不是集合类有 bug,而是选型错配——比如用 ArrayList 承载高并发写、用 HashMap 做 LRU。集合选型是业务建模的第一步,也是代码评审的必查项。

🏗 系统架构师 ​

我把 Java 集合按"List / Set / Queue / Map"四条线来组织:

  • List(有序可重复):ArrayList 底层数组、随机读 O(1) 尾插均摊 O(1);LinkedList 双向链表、头尾操作 O(1),但缓存不友好,我实际很少用它,绝大多数场景 ArrayDeque 更优;
  • Set(去重):HashSet 基于 HashMap;TreeSet 红黑树有序 O(log n);LinkedHashSet 保插入序;
  • Queue/Deque:ArrayDeque 做栈和队列的首选;并发侧 ArrayBlockingQueue(有界、锁)、LinkedBlockingQueue(两把锁分离读写)、SynchronousQueue(直接交接,线程池 CachedPool 用它);
  • Map:HashMap、LinkedHashMap(可做 LRU,重写 removeEldestEntry 即可)、TreeMap(范围查询)、并发场景 ConcurrentHashMap、写多读少用 ConcurrentSkipListMap。

选型思维:先问读写比、有序性、并发度三个问题,再定结构——比如做本地 LRU 我直接 LinkedHashMap 加锁或 Guava Cache,不重复造轮子。

💻 全栈开发专家 ​

两大体系:Collection(单值)和 Map(键值对)。

  • List 有序可重复:ArrayList(数组,随机访问 O(1),默认扩容 1.5 倍)、LinkedList(双端链表)、CopyOnWriteArrayList(读多写少的并发场景)。
  • Set 去重:HashSet(基于 HashMap)、LinkedHashSet(保插入顺序)、TreeSet(红黑树排序)。
  • Queue/Deque:ArrayDeque(做栈和队列首选,性能好于老 Stack)、PriorityQueue(堆)、各种 BlockingQueue(生产者-消费者)。
  • Map:HashMap、LinkedHashMap(可做 LRU,重写 removeEldestEntry)、TreeMap(有序范围查询)、ConcurrentHashMap。

工程选型经验:

  • 遍历时删除元素用 removeIf() 或 Iterator,别在 for-each 里直接 remove,会抛 ConcurrentModificationException。
  • 去重/判存一律 Set.contains,别用 list.contains()(O(n))。
  • 需要线程安全的计数优先 LongAdder,比同步 Map 高效得多。