← 返回首页
一、Java 基础高频
- HashMap 底层原理:数组+链表+红黑树,put 流程 → hash 扰动 → 定位桶 → 链表/树插入 → 扩容(2倍,rehash)。线程不安全,并发用 ConcurrentHashMap
- String 为什么不可变:final 类 + final char[],安全性(HashCode 缓存、线程安全、字符串池)
- == 和 equals 区别:== 比较引用地址(基本类型比较值),equals 默认同 ==,String/Integer 等重写为值比较
- 接口和抽象类:接口多实现、无构造器、JDK8 有 default 方法;抽象类单继承、可有构造器和成员变量
- 深拷贝 vs 浅拷贝:浅拷贝只复制引用,深拷贝递归复制所有引用对象(序列化实现)
二、并发编程高频
- synchronized 原理:Monitor 对象锁,JDK6 优化为偏向锁→轻量级锁→重量级锁,锁升级不可逆
- volatile 作用:保证可见性(MESI 缓存一致性)+ 禁止指令重排(内存屏障),不保证原子性
- 线程池参数:核心线程数(CPU 密集型=N+1,IO 密集型=2N)、最大线程数、队列类型(LinkedBlockingQueue 无界慎用)
- AQS 原理:AbstractQueuedSynchronizer,state 变量 + CLH 双向队列,ReentrantLock/Semaphore/CountDownLatch 底层
- ThreadLocal:线程本地变量,底层 ThreadLocalMap(弱引用 Key),注意内存泄漏需手动 remove()
三、JVM 高频
- 内存区域:堆(对象)、栈(栈帧)、方法区/元空间(类信息)、程序计数器、本地方法栈
- GC Roots:栈中引用、静态变量、常量引用、JNI 引用、synchronized 持有的对象
- OOM 排查:-XX:+HeapDumpOnOutOfMemoryError → MAT/JVisualVM 分析 → 定位大对象/内存泄漏
- 类加载时机:new 实例、访问静态字段/方法、反射、子类触发父类加载、main 方法所在类
四、Spring 高频
- Bean 生命周期:实例化→属性注入→Aware→BeanPostProcessor前→InitializingBean→init→BeanPostProcessor后→使用→destroy
- 循环依赖:三级缓存(成品池→半成品池→工厂池),构造器注入无法解决,prototype 无法解决
- 事务失效场景:非 public、自调用(未走代理)、异常被 catch、rollbackFor 未指定、传播行为不当
- 自动配置原理:@EnableAutoConfiguration → spring.factories / AutoConfiguration.imports → 条件注解过滤
五、MySQL 高频
- 索引优化:最左前缀、覆盖索引避免回表、索引下推(ICP)、联合索引字段顺序(区分度高的在前)
- 事务隔离级别:RU(脏读)→ RC(不可重复读)→ RR(默认,MVCC+Next-Key Lock 解决幻读)→ Serializable
- 慢 SQL 优化:EXPLAIN 分析 → 加索引 → 避免 SELECT * → 分页优化(延迟关联)→ 读写分离
- binlog / redo log / undo log:binlog(Server 层,主从复制)、redo log(InnoDB,崩溃恢复,WAL)、undo log(事务回滚+MVCC)
六、Redis 高频
- 为什么快:内存操作 + 单线程避免上下文切换 + IO 多路复用(epoll)+ 高效数据结构
- 持久化选择:RDB 恢复快但可能丢数据,AOF 数据安全但文件大,推荐混合持久化
- 分布式锁:SET key value NX EX + Lua 脚本释放(比较 value),Redisson 看门狗自动续期
- 过期策略:惰性删除 + 定期删除;淘汰策略:allkeys-lru / volatile-lru / noeviction 等
七、分布式高频
- CAP 定理:一致性/可用性/分区容错性三选二,分布式系统必须容忍 P,在 C 和 A 间权衡
- 分布式事务:2PC(强一致,阻塞)、TCC(补偿)、Saga(长事务)、本地消息表、Seata AT 模式
- 分布式 ID:雪花算法(时间戳+机器ID+序列号)、号段模式(Leaf)、UUID(无序不推荐做主键)
- 限流算法:固定窗口 / 滑动窗口 / 漏桶(匀速)/ 令牌桶(允许突发)
- 一致性哈希:哈希环 + 虚拟节点,解决节点增减时大量数据迁移问题