14、Java 基础硬核复习:数据结构与集合源码的核心逻辑与面试考点

14、Java 基础硬核复习:数据结构与集合源码的核心逻辑与面试考点

一、核心知识体系:数据结构的"两大维度"与"集合源码剖析"

本章的知识围绕"数据结构基础"和"集合底层实现"展开,可归纳为两大维度 (数据结构分类、集合源码)和三大专题(数据结构概述、核心数据结构、集合源码)。

1. 数据结构基础:存储与运算的核心逻辑

数据结构是算法的基石,主要分为存储结构运算结构

  • 存储结构
    • 顺序存储(如数组):内存地址连续,查询快(O(1)),增删慢(需移动元素,O(n));
    • 链式存储(如链表):内存地址不连续,增删快(只需修改指针,O(1)),查询慢(需遍历,O(n))。
  • 运算结构
    • 栈(Stack):后进先出(LIFO),如方法调用栈(递归)、表达式求值(后缀表达式);
    • 队列(Queue) :先进先出(FIFO),如线程池任务队列(BlockingQueue)、消息队列(Kafka);
    • 二叉树(Binary Tree):每个节点最多两个子节点,遍历方式包括前序(根-左-右)、中序(左-根-右)、后序(左-右-根)(中序遍历二叉搜索树可得到有序序列)。

2. 集合源码剖析:ArrayList、LinkedList、HashMap的底层实现

集合框架的底层是数据结构的具体应用,需掌握其核心实现:

  • ArrayList
    • JDK7:像"饿汉式",创建对象时直接初始化长度为10的数组;
    • JDK8 :像"懒汉式",创建对象时数组为空,第一次调用add才初始化长度为10;
    • 扩容机制 :默认扩容为原来的1.5倍newCapacity = oldCapacity + (oldCapacity >> 1)),使用Arrays.copyOf复制老数组(比JDK7的System.arraycopy更高效)。
  • LinkedList
    • 基于双向链表,每个节点包含prev(前驱)、item(数据)、next(后继)指针,增删操作时间复杂度O(1),查询慢(O(n))。
  • HashMap
    • JDK7 :数组+链表,哈希冲突用头插法(极端情况下链表成环,导致死循环);
    • JDK8 :数组+链表+红黑树 ,哈希冲突用尾插法(解决死循环),当链表长度>8且数组长度>64时,链表转为红黑树(查询复杂度从O(n)降到O(log n));
    • put流程 :计算key的哈希值→定位数组索引→若索引为空,直接插入;若不为空,判断是否为key相同(equals),相同则覆盖;不同则解决哈希冲突(链表/红黑树)。
  • LinkedHashMap
    • 继承自HashMap,在Entry中增加beforeafter指针,形成双向链表维护插入顺序(用于LRU缓存)。
  • HashSet
    • 内部用HashMap实现,元素作为HashMapkeyvalue固定为PRESENTObject对象),去重依赖HashMapkey唯一性。

二、高频面试考点:必考"源码死穴",掌握这些=掌握数据结构与集合核心

本章的面试题全是"造火箭"级别的,需死记硬背关键数值和流程:

1. ArrayList的扩容机制(必考 Top1)

  • 考点:JDK7和JDK8的扩容区别?
  • 答案
    • JDK7 :默认容量10,每次扩容1.5倍,扩容时用System.arraycopy复制数组;
    • JDK8 :默认容量10(懒加载),扩容1.5倍,用Arrays.copyOf(更高效)。

2. HashMap的底层结构(大厂必问)

  • 考点:JDK7和JDK8的区别?为什么引入红黑树?
  • 答案
    • JDK7 :数组+链表,极端情况下(所有key哈希冲突),查找复杂度退化为O(n);
    • JDK8:数组+链表+红黑树,链表长度>8且数组长度>64时转红黑树,查询复杂度优化为O(log n)。

3. HashMap的扩容(Resize)

  • 考点:什么时候扩容?为什么是2的幂次方?
  • 答案
    • 时机 :元素个数>容量×负载因子(16×0.75=12);
    • 扩容倍数:2倍;
    • 2的幂次方原因 :让hash % n等价于hash & (n-1)(位运算更高效)。

4. HashMap线程不安全

  • 考点:多线程下会发生什么?
  • 答案
    • JDK7:并发扩容时链表成环(死循环);
    • JDK8 :解决死循环,但仍会数据覆盖 (多线程请用ConcurrentHashMap)。

5. HashSet的底层

  • 考点:HashSet怎么存数据?
  • 答案HashSet底层是HashMap,把数据作为key存进去,value是固定的PRESENTObject对象)。

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

  1. 看源码 :打开IDE(如IntelliJ),按住Ctrl点进java.util.HashMap,看put方法、扩容逻辑;
  2. 记关键数字 :记住10(List初始容量)、16(Map初始容量)、0.75(负载因子)、8(转红黑树阈值)、64(数组长度阈值);
  3. 理解结构 :脑子里要有"双向链表"的图(如LinkedListLinkedHashMap的节点结构),理解增删的指针操作。

四、总结:数据结构与集合是"Java底层"的核心

相关推荐
明灯伴古佛几秒前
面试:对Spring AOP的理解
java·spring·面试
Nyarlathotep01134 分钟前
ConcurrentHashMap源码分析
java·后端
汀、人工智能7 分钟前
[特殊字符] 第24课:反转链表
数据结构·算法·链表·数据库架构··反转链表
田梓燊12 分钟前
leetcode 41
数据结构·算法·leetcode
Barkamin42 分钟前
多线程简单介绍
java·开发语言·jvm
凌波粒1 小时前
LeetCode--18.四数之和(双指针法)
数据结构·算法·leetcode
莫叫石榴姐1 小时前
字节广告数开一面 | 实习
大数据·数据仓库·面试
2402_881319301 小时前
引入 Redis 分布式锁解决并发脏写 (Dirty Write)-AI模拟面试的构建rag部分
redis·分布式·面试
汀、人工智能1 小时前
[特殊字符] 第26课:环形链表
数据结构·算法·链表·数据库架构··环形链表
小比特_蓝光1 小时前
算法篇二----二分查找
java·数据结构·算法