LIBRARY / 文章资料库
按目录阅读
当前目录面试7 篇
目录 一句话定位 一、HashMap 底层结构 JDK 1.7:数组 + 链表 JDK 1.8:数组 + 链表 + 红黑树 二、核心概念 哈希函数 负载因子(Load Factor) 树化阈值(TREEIFY_THRESHOLD) 扩容阈值(Threshold) 三、put 流程(JDK 1.8) 完整步骤 四、扩容机制(Resize) 什么时候扩容? 扩容做了什么? JDK 1.7 vs 1.8 扩容对比 五、面试高频问题 Q1:为什么 HashMap 初始容量是 16? Q2:为什么负载因子是 0.75? Q3:为什么要转红黑树?什么时候转? Q4:为什么链表转红黑树阈值是 8? 引用 HashMap 底层原理与扩容 一句话定位HashMap 是基于哈希表的 Map 实现,JDK 1.8 后采用「数组 + 链表 + 红黑树」结构,通过哈希函数定位数组索引,链表/红黑树解决哈希冲突,通过动态扩容保证性能。 一、HashMap 底层结构JDK 1.7:数组 + 链表12345数组(Entry[])├─ [0] → Entry(key1,value1) ...
目录 一、一句话 MyBatis 二、MyBatis 核心架构 核心组件图解 核心组件详解 三、完整执行流程 流程图 详细步骤 四、动态代理实现原理 getMapper 源码解析 MapperProxy 源码解析 完整示例 五、SQL 执行流程 四大组件 Executor StatementHandler ParameterHandler ResultSetHandler 六、缓存机制 一级缓存 二级缓存 对比表 七、插件机制 四大可拦截对象 @Intercepts 和 @Signature 注解 插件实现示例 执行链原理 八、面试高频问题 MyBatis 原理 一、一句话 MyBatis MyBatis 是一个优秀的 持久层框架,它支持定制化 SQL、存储过程以及高级映射,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO 为数据库中的记录。 简单说:是对 JDBC 的封装,XML/注解写 SQL,动态代理调用,自动映射结果。 二、MyBatis 核心架 ...
目录 一句话定位 一、HashMap 扩容时线程不安全在哪? 场景 1:JDK 1.7 环形链表导致死循环 场景 2:数据覆盖/丢失 二、JDK 1.7 死循环问题复现 核心原因:头插法 + 多线程扩容 详细过程 三、JDK 1.8 还有线程安全问题吗? 问题 1:size 计数丢失 问题 2:put 元素覆盖 四、线程安全的解决方案 方案 1:Collections.synchronizedMap 方案 2:Hashtable 方案 3:ConcurrentHashMap(推荐) 五、面试回答话术(结构版) 回答 1:HashMap 为什么线程不安全? 回答 2:怎么解决 HashMap 线程安全问题? 引用 HashMap 线程安全问题与解决方案 一句话定位HashMap 是线程不安全的,多线程环境下扩容会导致 1.7 环形链表死循环、1.8 数据覆盖/丢失;解决方案用 ConcurrentHashMap。 一、HashMap 扩容时线程不安全在哪?场景 1:JDK 1.7 环形链表导致死循环 现象 CPU 100%,线程卡在 Ha ...
目录 一、什么是循环依赖 二、Spring 三级缓存机制 三、核心流程详解(A → B → A) 关键代码(DefaultSingletonBeanRegistry): 四、为什么需要三级缓存而不是两级 五、Spring 无法解决的情况 构造器注入失败示例: 六、解决方案 方案 1:构造器注入 + @Lazy(最常用) 方案 2:改用 setter 注入 方案 3:抽取公共逻辑到第三个 Bean(架构层面解耦) 方案 4:实现 ApplicationContextAware 延迟获取 七、面试高频追问 Q1:Spring Boot 2.6 默认禁止了循环依赖,怎么开启? Q2:为什么 Spring 不推荐循环依赖? Q3:构造器注入 + @Lazy 的原理? Q4:二级缓存够不够? Q5:SpringBoot 2.6 为什么要默认禁止? 八、一句话总结 引用 Spring Bean 循环依赖 关联阅读:Spring Bean生命周期 一、什么是循环依赖两个或多个 Bean 之间相互持有对方的引用,形成闭环: 12A → B → A (两个 ...
目录 一、Spring 和 Spring Boot 有什么区别 一句话 核心区别 自动配置原理(必问) 关键条件注解 面试回答 二、Spring Boot 配置文件优先级 优先级从高到低(完整版) 高频考点:jar 包外 > jar 包内 完整的外部配置覆盖顺序(jar 外) 高频考点:properties vs yml 优先级 高频考点:多配置文件激活 高频考点:配置文件 vs 代码默认值 —— 谁覆盖谁? 第一种:@ConfigurationProperties 字段初始值 / @Value 冒号默认值 验证: 第二种:SpringApplication.setDefaultProperties() 设置的默认值 完整优先级图示(关键!) 三、Spring Boot 怎么接入一个外部组件 第二步:配置连接 第三步:直接使用 Starter 自动配置原理(面试核心) 自定义 Starter 的标准套路(进阶考点) 1. 项目结构 2. 配置属性类 3. 核心服务 4. 自动配置类 5. 注册自动配置 6. 使用方引入 接入外部组件的三种模式总结 四、面 ...
synchronized vs ReentrantLock目录 一、核心区别(面试第一答) 二、synchronized 原理 三、ReentrantLock 原理(AQS) 四、ReentrantLock 四大高级功能 五、公平锁 vs 非公平锁 六、如何选择 七、面试追问 一、核心区别 synchronized ReentrantLock 层面 JVM 内置(monitorenter/monitorexit) API 层(AQS) 释放 自动(退出同步块) 手动 unlock(必须在 finally) 可中断 ❌ ✅ lockInterruptibly() 超时 ❌ ✅ tryLock(timeout) 公平 仅非公平 公平/非公平可选 条件变量 1 个 wait/notify 多个 Condition,精确唤醒 锁状态 不可查 可查(isLocked、队列长度等) 读写分离 ❌ ✅ ReentrantReadWriteLock 共同点:都支持可重入。 面试一句话: synchronized 是 JVM ...
Spring Bean生命周期目录 一、Bean 完整生命周期 详细流程 代码验证 二、BeanPostProcessor 详解 接口定义 执行时机 为什么前置处理少用? 总结对比 三、BeanPostProcessor 实战场景 场景1:AOP 代理创建 场景2:自定义注解校验 场景3:接口实现自动替换 场景4:监控/日志埋点 场景5:敏感字段脱敏 四、为什么要代理? 代理解决了什么问题 为什么是代理而不是其他方式? JDK 动态代理 vs CGLIB Spring AOP 代理创建过程 代理失效的常见场景 五、代理对象 vs 真实对象 本质区别 核心区别一览 内存中的关系 为什么容器里放代理对象? 代理对象调用链 this 调用为什么绕过代理 JDK 动态代理 vs CGLIB 代理对象 怎么判断代理还是真实对象? 六、其他 Post 接口 BeanFactoryPostProcessor vs BeanPostProcessor InstantiationAwareBeanPostProcessor DestructionAwareBeanPostP ...






