12、Java 基础硬核复习:集合框架(数据容器)的核心逻辑与面试考点
一、核心知识体系:集合框架的"两大体系"与"三大分支"
本章的知识围绕"集合框架概述、Collection接口、Map接口、工具类"展开,可归纳为两大体系 (Collection、Map)和三大分支(List、Set、Map)。
1. 集合框架概述:Collection与Map的区别
集合框架是Java中用于存储和操作对象的容器,核心分为两大体系:
- Collection :存储单个元素 的集合(如
List、Set),继承自Collection接口; - Map :存储**键值对(key-value)**的集合(如
HashMap、TreeMap),不继承Collection接口。
2. Collection接口:常用方法与迭代器
Collection是集合框架的根接口,定义了所有集合的通用方法,需掌握其核心方法及迭代器机制:
- 常用方法 :
add()(添加元素)、remove()(删除元素)、contains()(判断是否存在)、size()(获取元素个数)、iterator()(获取迭代器)。 - 迭代器(Iterator) :用于遍历集合,核心方法
hasNext()(判断是否有下一个元素)、next()(获取下一个元素)。 - 增强for循环(foreach) :底层基于迭代器实现,简化集合遍历(如
for (String s : list) { ... })。
3. List接口:有序、可重复的集合
List是Collection的子接口,特点是有序、可重复,常用实现类包括:
- ArrayList :基于动态数组 实现,查询快(O(1))、增删慢(O(n)),线程不安全(推荐使用)。
- 扩容机制:默认容量10,每次扩容为原来的1.5倍(
newCapacity = oldCapacity + (oldCapacity >> 1))。
- 扩容机制:默认容量10,每次扩容为原来的1.5倍(
- LinkedList :基于双向链表实现,增删快(O(1))、查询慢(O(n)),线程不安全。
- Vector :基于动态数组实现,线程安全(方法用
synchronized修饰),效率低(不推荐使用)。
4. Set接口:无序、不可重复的集合
Set是Collection的子接口,特点是无序、不可重复,常用实现类包括:
- HashSet :基于哈希表 实现,无序(插入顺序与遍历顺序无关),查询快(O(1)),线程不安全。
- 去重原理:依赖
HashMap的key(HashSet内部用HashMap存储,元素作为key,value固定为PRESENT)。
- 去重原理:依赖
- LinkedHashSet :基于链表+哈希表实现,有序(插入顺序与遍历顺序一致),查询快(O(1)),线程不安全。
- TreeSet :基于红黑树实现,有序(自然排序或定制排序),查询快(O(log n)),线程不安全。
5. Map接口:键值对集合
Map是键值对集合,常用实现类包括:
- HashMap :基于哈希表 实现,无序(插入顺序与遍历顺序无关),查询快(O(1)),线程不安全(推荐使用)。
- 底层结构:JDK8之前是数组+链表 ,JDK8之后是数组+链表+红黑树(链表长度超过8且数组长度超过64时,链表转为红黑树)。
put流程:计算key的哈希值→定位数组索引→若索引为空,直接插入;若不为空,判断是否为key相同(equals),相同则覆盖;不同则解决哈希冲突(链表/红黑树)。
- LinkedHashMap :在
HashMap基础上增加链表维护插入顺序。 - TreeMap :基于红黑树 实现,按
Key排序(自然排序或定制排序),查询快(O(log n)),线程不安全。 - Hashtable :基于哈希表实现,线程安全(方法用
synchronized修饰),效率低(不推荐使用),不允许nullkey/value。 - Properties :
Hashtable的子类,用于存储配置文件 (键值对为String类型),常用load()(加载配置文件)、store()(保存配置文件)。
6. 工具与遍历
Iterator(迭代器) :用于遍历Collection,核心方法hasNext()、next()、remove()。- 增强for循环:语法糖,底层基于迭代器实现。
Collections工具类 :提供排序(sort)、同步集合(synchronizedList)、查找(binarySearch)等静态方法。
二、高频面试考点:必考"死穴",掌握这些=掌握集合框架核心
本章的面试题含金量极高,HashMap 是重灾区,以下是必考考点:
1. ArrayList vs LinkedList(必考 Top1)
- 考点:底层结构与性能差异?
- 答案 :
- ArrayList :底层是动态数组 ,内存连续,支持下标访问,查询快(O(1)) ;增删需移动元素,增删慢(O(n))。
- LinkedList :底层是双向链表 ,插入删除只需改指针,增删快(O(1)) ;内存不连续,无法下标访问,查询慢(O(n))。
- 结论 :查询多的场景用
ArrayList;增删多的场景用LinkedList。
2. HashMap的底层实现原理(大厂必问)
- 考点:JDK7和JDK8的区别?什么时候转红黑树?
- 答案 :
- 基本结构 :底层是Entry数组 (JDK8叫
Node),通过hash(key)计算下标。哈希冲突用链地址法(链表/红黑树)。 - JDK8优化 :链表长度超过8 且数组长度超过64 时,链表转为红黑树 ,将查找复杂度从
O(n)降到O(log n)。
- 基本结构 :底层是Entry数组 (JDK8叫
3. HashMap vs Hashtable
- 考点:区别是什么?
- 答案 :
- 线程安全 :
HashMap线程不安全;Hashtable线程安全(方法用synchronized)。 - Null值 :
HashMap允许nullkey(1个)和nullvalue(多个);Hashtable不允许nullkey/value。 - 效率 :
HashMap效率更高。
- 线程安全 :
4. HashSet如何保证元素唯一性?
- 考点 :只重写
equals不重写hashCode行不行? - 答案 :不行 。
- 机制 :先计算
hashCode()确定"坑位",若坑位无元素则直接存;若有元素,比较hashCode,再调用equals()比较内容。只有两者都相同才认为是重复元素。
- 机制 :先计算
5. 遍历集合时删除元素
- 考点 :在
for循环里调用list.remove()会发生什么? - 答案 :会报
ConcurrentModificationException(fail-fast机制)。- 解决 :必须使用迭代器的
iterator.remove()方法。
- 解决 :必须使用迭代器的
6. Comparable vs Comparator
- 考点 :在
TreeSet或Collections.sort中怎么用? - 答案 :
Comparable(内部):类实现compareTo,定义"自然排序"(如String、Integer)。Comparator(外部):定义单独的比较器传进去,定义"定制排序"(更灵活,不修改源码)。
三、学习建议:从"理论"到"实践"的跃迁
- 手写代码 :熟练写出
ArrayList的增删改查和HashMap的遍历(EntrySet/KeySet)。 - 看源码 :阅读
ArrayList的扩容机制(默认容量10,扩容1.5倍)和HashMap的put方法,理解底层原理。 - 对比总结 :对比
ArrayList与LinkedList、HashMap与Hashtable、HashSet与TreeSet的区别,加深记忆。
四、总结:集合框架是"Java数据管理"的核心
第12章是"集合框架"的硬核复习,它将你从"掌握语法"带入"高效管理数据"的层面。掌握这些知识,你就能写出更高效的代码,也能在面试中轻松应对"Java基础"的"高频考点"。
记住,集合框架是Java开发的"数据容器" ------熟练使用List、Set、Map,是成为优秀Java开发者的"基本功"。