12、Java 基础硬核复习:集合框架(数据容器)的核心逻辑与面试考点

12、Java 基础硬核复习:集合框架(数据容器)的核心逻辑与面试考点

一、核心知识体系:集合框架的"两大体系"与"三大分支"

本章的知识围绕"集合框架概述、Collection接口、Map接口、工具类"展开,可归纳为两大体系 (Collection、Map)和三大分支(List、Set、Map)。

1. 集合框架概述:Collection与Map的区别

集合框架是Java中用于存储和操作对象的容器,核心分为两大体系:

  • Collection :存储单个元素 的集合(如ListSet),继承自Collection接口;
  • Map :存储**键值对(key-value)**的集合(如HashMapTreeMap),不继承Collection接口。

2. Collection接口:常用方法与迭代器

Collection是集合框架的根接口,定义了所有集合的通用方法,需掌握其核心方法及迭代器机制:

  • 常用方法add()(添加元素)、remove()(删除元素)、contains()(判断是否存在)、size()(获取元素个数)、iterator()(获取迭代器)。
  • 迭代器(Iterator) :用于遍历集合,核心方法hasNext()(判断是否有下一个元素)、next()(获取下一个元素)。
  • 增强for循环(foreach) :底层基于迭代器实现,简化集合遍历(如for (String s : list) { ... })。

3. List接口:有序、可重复的集合

ListCollection的子接口,特点是有序、可重复,常用实现类包括:

  • ArrayList :基于动态数组 实现,查询快(O(1))、增删慢(O(n)),线程不安全(推荐使用)。
    • 扩容机制:默认容量10,每次扩容为原来的1.5倍(newCapacity = oldCapacity + (oldCapacity >> 1))。
  • LinkedList :基于双向链表实现,增删快(O(1))、查询慢(O(n)),线程不安全。
  • Vector :基于动态数组实现,线程安全(方法用synchronized修饰),效率低(不推荐使用)。

4. Set接口:无序、不可重复的集合

SetCollection的子接口,特点是无序、不可重复,常用实现类包括:

  • HashSet :基于哈希表 实现,无序(插入顺序与遍历顺序无关),查询快(O(1)),线程不安全。
    • 去重原理:依赖HashMapkeyHashSet内部用HashMap存储,元素作为keyvalue固定为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修饰),效率低(不推荐使用),不允许null key/value。
  • PropertiesHashtable的子类,用于存储配置文件 (键值对为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)

3. HashMap vs Hashtable

  • 考点:区别是什么?
  • 答案
    1. 线程安全HashMap线程不安全;Hashtable线程安全(方法用synchronized)。
    2. Null值HashMap允许null key(1个)和null value(多个);Hashtable不允许null key/value。
    3. 效率HashMap效率更高。

4. HashSet如何保证元素唯一性?

  • 考点 :只重写equals不重写hashCode行不行?
  • 答案不行
    • 机制 :先计算hashCode()确定"坑位",若坑位无元素则直接存;若有元素,比较hashCode,再调用equals()比较内容。只有两者都相同才认为是重复元素。

5. 遍历集合时删除元素

  • 考点 :在for循环里调用list.remove()会发生什么?
  • 答案 :会报ConcurrentModificationException(fail-fast机制)。
    • 解决 :必须使用迭代器的iterator.remove()方法。

6. Comparable vs Comparator

  • 考点 :在TreeSetCollections.sort中怎么用?
  • 答案
    • Comparable(内部):类实现compareTo,定义"自然排序"(如StringInteger)。
    • Comparator(外部):定义单独的比较器传进去,定义"定制排序"(更灵活,不修改源码)。

三、学习建议:从"理论"到"实践"的跃迁

  1. 手写代码 :熟练写出ArrayList的增删改查和HashMap的遍历(EntrySet/KeySet)。
  2. 看源码 :阅读ArrayList的扩容机制(默认容量10,扩容1.5倍)和HashMapput方法,理解底层原理。
  3. 对比总结 :对比ArrayListLinkedListHashMapHashtableHashSetTreeSet的区别,加深记忆。

四、总结:集合框架是"Java数据管理"的核心

第12章是"集合框架"的硬核复习,它将你从"掌握语法"带入"高效管理数据"的层面。掌握这些知识,你就能写出更高效的代码,也能在面试中轻松应对"Java基础"的"高频考点"。

记住,集合框架是Java开发的"数据容器" ------熟练使用ListSetMap,是成为优秀Java开发者的"基本功"。

相关推荐
兰令水19 小时前
leecodecode【树形DP】【2026.6.11打卡-java版本】
java·算法·深度优先
骑士雄师19 小时前
19.3 langgraph的工作节点和路由函数
java·前端·数据库
fox_lht19 小时前
14.6.将错误重定向到标准错误
开发语言·后端·学习·rust
SWAGGY..20 小时前
Linux系统编程:(十三)环境变量
java·linux·算法
程序员黑豆20 小时前
AI全栈开发 - Java:基本数据类型 vs 引用数据类型的内存存储
java·前端·ai编程
布朗克16820 小时前
34 JVM深入理解
java·jvm
Flittly20 小时前
【AgentScope Java新手村系列】(4)结构化输出
java·spring boot·spring·ai
wzg19690226wzg20 小时前
rust 学习 泛型
开发语言·学习·rust
techdashen20 小时前
Rust 基础设施团队 2025 Q4 回顾与 2026 Q1 计划
开发语言·后端·rust