题目:Java 中的集合类有哪些?如何分类的?
难度:low
标签:java/collections, general/knowledge
评分:⭐⭐☆☆☆(2/5)
Java 集合核心的其实也就是两项,一个是 List 系的,一个是 Map 系的。也就是链表跟,也就是存储一系列的 List,然后另外一个以及 Key-Value 类型的 Map。然后 List 衍生下来包括,Arraylist、LinkedList,然后还有相关的 LinkedList 衍生出来的栈跟队列。另外就是 HashMap 衍生出来类队列的 Set 集合,基本上就这几种类型。然后常用的就是 Arraylist,然后用来做日常的数据存储。然后 Linked List 可以做类似链表或者栈的方面的操作。Set 用来去重,存储常规数据集合。Map 方面就存储 KV,KV 映射。一般可以拿 MySQL 做缓存,然后保存一些日常的缓存数据。Redis 也可以当做一个大的 Map
优点:
不足:
补充:
核心考点定位:验证对 Java 集合框架顶层结构的整体认知,能否画出完整体系图并说清每种容器的选型场景。
知识点拆解:
Collection(元素集合)和 Map(键值对),Map 不在 Collection 之下。Collection 之下按语义分三支:List(有序可重复)、Set(无序不重复)、Queue(队列语义)。Vector、Stack 在 JDK5 后被 Collections.synchronizedList、Deque 全面替代;Dictionary 已被 Map 替代。按「底层原理 → 设计权衡 → 工程实践」递进排列。
考察方向:
Deque extends Queue extends Collection)java.util 和 java.util.concurrent 下的集合形成选型谱系ConcurrentLinkedQueue + 去重逻辑,或自建 ConcurrentHashSet)延伸递进面试题:
Deque 和 Queue 什么关系?为什么推荐用 Deque?Deque 是 Queue 的子接口,扩展了双端操作(push/pop/addFirst/addLast)。用 Deque 而非 Stack,因为 Stack 是 Vector 派生、全方法 synchronized 且过时。ArrayList 和 LinkedList 到底谁快?CopyOnWriteArrayList 适合什么场景?为什么不适合写多?面试官您好,Java 集合框架的顶层结构是两根主干——Collection 和 Map,两者并列,Map 并不属于 Collection。
Collection 下面分三支:List 是有序可重复的,比如 ArrayList(数组,随机访问快)、LinkedList(双向链表,两端增删快)、CopyOnWriteArrayList(并发读);Set 是元素不重复的,有 HashSet(无序 O(1) 查重)、LinkedHashSet(保插入序)、TreeSet(自然排序);Queue 是队列语义,包含 PriorityQueue(堆)、ArrayDeque(双端队列)、ConcurrentLinkedQueue(无锁并发队列)。这里要注意 Deque 是 Queue 的子接口,扩展了双端操作,推荐用它替代过时的 Stack。
Map 下面主要有 HashMap(无序 O(1))、LinkedHashMap(保插入序、可当 LRU 缓存)、TreeMap(键自然排序)、ConcurrentHashMap(并发读写)和 WeakHashMap(弱引用清理)。选型上,日常业务 90% 是 ArrayList + HashMap;需要去重且保插入序用 LinkedHashSet 或 LinkedHashMap;需要排序用 TreeSet 或 TreeMap;并发场景直接上 ConcurrentHashMap。
另外提醒下,Vector 和 Stack 在 JDK5 之后已经被标记过时,用 Collections.synchronizedList 和 Deque 替代即可;Dictionary 也早已让位给 Map。真正并发容器都在 java.util.concurrent 包下,比如 ConcurrentSkipListSet、BlockingQueue 家族等。整体上选型口诀就是"要序用 Linked,要排用 Tree,要并发上 Concurrent,要快访问用 Array"。