List有序可重复、支持索引访问;Set无序不可重复、无索引;Map键值对存储、键唯一、通过键高效查值。三者分属Collection与Map两大独立体系,设计目标分别为“组织元素”和“建立映射”。

直接从面试官最常问的逻辑切入:不是背类名,而是盯住“存什么、怎么存、为什么这么存”三层问题。掌握这根主线,List、Set、Map 的区别和选择就自然浮现,不用硬记。
抓住两大体系的本质差异
Collection 和 Map 不是并列关系,更不是父子关系——它们是两套独立设计的语言。
- Collection回答“我有一堆东西,怎么组织它们”:关注元素本身是否有序、能否重复、有没有索引;
- Map回答“我有一堆关系,怎么快速找到某个键对应的值”:核心是键的唯一性、查找效率、遍历顺序是否保留。
面试一上来问“List 和 Map 有什么区别”,答“一个存单个元素,一个存键值对”只是表层。真正加分的回答是:“List 保证插入顺序和索引访问能力,适合按位置操作数据;Map 放弃了顺序和索引,换来 O(1) 平均查找性能,本质是用空间换时间的映射结构。”
吃透三类核心容器的选型逻辑
别孤立记 ArrayList 和 LinkedList 的时间复杂度,要结合场景反推设计意图:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 查得多、改得少 → ArrayList:比如后台返回分页列表,前端只展示不频繁增删,数组的随机访问优势直接生效;
- 频繁在头尾增删 → LinkedList 或 ArrayDeque:比如实现消息队列或栈,链表指针操作快,ArrayDeque 数组实现但双端高效,比 LinkedList 更推荐;
- 要去重 → 先想 HashSet 还是 TreeSet:只要去重不要顺序,HashSet(哈希表)最快;需要按字母或数值排序,TreeSet(红黑树)自动维护顺序;既要插入顺序又要去重,LinkedHashSet 是唯一解。
直击 HashMap 底层的三个关键点
这是几乎所有 Java 岗必问的“锚点题”,重点不在背源码,而在理解设计权衡:
- 哈希冲突怎么处理? JDK 1.8 用链表 + 红黑树:链表短时开销小,链表长且数组够大时转红黑树,避免退化成 O(n) 查找;
- 为什么负载因子是 0.75? 太小浪费空间,太大冲突激增——0.75 是时间和空间折中的经验值;
- null 键能存几个? 只能有一个。HashMap 把 null 键特殊处理,固定放在数组索引 0 的位置,所以重复 put(null, v) 会覆盖,不是报错。
绕不开的线程安全陷阱
面试官爱问“ArrayList 线程安全吗”,其实是在考你是否分清“语法正确”和“行为正确”:
- 直接用 ArrayList 多线程 add(),大概率丢数据——不是抛异常,而是结果比预期少;
- Collections.synchronizedList() 加了对象锁,但复合操作仍不安全(比如 if(list.isEmpty()) list.add(x) 中间可能被其他线程插入);
- CopyOnWriteArrayList 适合读远多于写的场景(如监听器列表),写操作复制整个数组,代价高但读完全无锁;
- ConcurrentHashMap 分段锁(JDK 1.7)→ CAS + synchronized(JDK 1.8),真正支持高并发读写,是生产首选。

















