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开发者的"基本功"。

相关推荐
我材不敲代码6 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
身如柳絮随风扬7 小时前
Java中的CAS机制详解
java·开发语言
韩立学长8 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
风筝在晴天搁浅8 小时前
hot100 78.子集
java·算法
froginwe118 小时前
Scala 循环
开发语言
m0_706653238 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你919 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Bruk.Liu9 小时前
(LangChain实战2):LangChain消息(message)的使用
开发语言·langchain
qq_423233909 小时前
C++与Python混合编程实战
开发语言·c++·算法