救命版速记

Carlos 发布于 1 小时前 4 次阅读


1. Java 基础

HashMap

HashMap 底层是数组 + 链表 + 红黑树。通过 key 的 hash 值定位数组下标,如果发生 hash 冲突,就用链表存储;链表长度超过阈值并且数组容量足够时,会转成红黑树,提高查询效率。HashMap 不是线程安全的。

追问扩容:

默认负载因子是 0.75,元素数量超过容量乘负载因子时会扩容,一般扩为原来的 2 倍,并重新计算元素位置。

ConcurrentHashMap

ConcurrentHashMap 是线程安全的 Map。JDK 1.8 之后主要使用 CAS + synchronized 来保证并发安全,锁的粒度更细,一般锁住的是桶节点,而不是整张表,所以并发性能比 Hashtable 好。


2. JUC 并发

线程池

线程池主要是为了复用线程、控制并发数量、避免频繁创建销毁线程。核心参数有 corePoolSize、maximumPoolSize、workQueue、keepAliveTime、threadFactory、拒绝策略。

执行流程:

先用核心线程处理;核心线程满了进队列;队列满了再创建非核心线程;线程数到最大还处理不了就走拒绝策略。

synchronized 和 ReentrantLock

synchronized 是 JVM 层面的锁,使用简单,会自动释放锁。ReentrantLock 是 JUC 提供的锁,功能更灵活,可以 tryLock、可中断、公平锁,但需要手动 unlock。

CAS

CAS 是比较并交换,是一种乐观锁思想。更新时先比较内存值是否等于预期值,如果相等就更新,否则失败重试。问题是 ABA、自旋开销、只能保证单个变量原子性。

ThreadLocal

ThreadLocal 是线程本地变量,每个线程有自己独立的一份副本。项目里可以用来保存当前请求用户上下文。线程池场景下一定要 remove,避免内存泄漏和数据串用。

AQS

AQS 是 JUC 很多同步器的基础框架,比如 ReentrantLock、CountDownLatch、Semaphore。核心思想是用一个 volatile state 表示同步状态,再配合 FIFO 队列管理获取锁失败的线程。

JMM

JMM 是 Java 内存模型,主要解决多线程下的可见性、有序性和原子性问题。volatile 可以保证可见性和一定的有序性,synchronized 可以保证原子性、可见性和有序性。


3. JVM

内存结构

JVM 运行时内存主要包括堆、栈、方法区、程序计数器、本地方法栈。堆存对象,是 GC 主要区域;栈存方法调用的栈帧;方法区存类信息、常量、静态变量等。

类加载

类加载流程包括加载、验证、准备、解析、初始化。双亲委派模型是类加载器先把加载请求交给父加载器,父加载器加载不了才由子加载器加载,主要是为了保证核心类安全和避免重复加载。

GC

判断对象是否可回收主要用可达性分析,从 GC Roots 出发找不到的对象就可以回收。常见算法有标记清除、复制、标记整理、分代收集。

G1

G1 把堆划分成多个 Region,会优先回收垃圾收益高的 Region,目标是可预测停顿时间,适合服务端大堆内存场景。


4. MySQL

索引

InnoDB 常用 B+ 树索引。B+ 树高度低,叶子节点有序,适合范围查询。索引能提高查询效率,但会增加写入和维护成本,不是越多越好。

事务

事务有 ACID:原子性、一致性、隔离性、持久性。MySQL 通过 Undo Log 保证回滚,通过 Redo Log 保证崩溃恢复,通过锁和 MVCC 保证隔离性。

MVCC

MVCC 是多版本并发控制。InnoDB 通过隐藏字段、Undo Log 和 ReadView 实现快照读,让读写可以并发执行,减少锁冲突。

Redo / Undo / Binlog

Redo Log 是物理日志,用于崩溃恢复;Undo Log 是逻辑回滚日志,用于事务回滚和 MVCC;Binlog 是 MySQL Server 层日志,主要用于主从复制和数据恢复。

慢 SQL 优化

先用慢 SQL 日志定位问题,再用 explain 看执行计划,比如是否走索引、扫描行数、是否 filesort。优化方式包括加合适索引、避免索引失效、减少 select *、分页优化、拆分复杂 SQL。


5. Redis

数据结构

常见有 String、Hash、List、Set、ZSet。String 常做缓存和计数器,Hash 存对象,List 做队列,Set 做去重,ZSet 做排行榜。

持久化

Redis 有 RDB 和 AOF。RDB 是定时快照,恢复快但可能丢最近数据;AOF 记录写命令,数据更完整但文件更大。生产中可以结合使用。

缓存三大问题

穿透:查不存在的数据,解决用布隆过滤器和空值缓存。
击穿:热点 key 失效,大量请求打数据库,解决用互斥锁或逻辑过期。
雪崩:大量 key 同时失效,解决用随机 TTL、限流、预热。

主从 / Cluster

主从复制用于读写分离和数据备份;哨兵用于主节点故障转移;Cluster 通过槽位分片实现水平扩容。


6. RabbitMQ

RabbitMQ 是消息队列,主要用于异步、解耦和削峰。核心模型是 Producer → Exchange → Queue → Consumer。
项目里点击统计不是 302 主链路,所以发送点击事件到 MQ,消费者异步写访问日志和点击数。

可靠性:

生产端 confirm、队列和消息持久化、消费端 ACK、失败重试、死信队列。重复消费需要业务幂等,比如唯一消息 ID 或数据库唯一约束。

积压:

增加消费者并发、优化消费逻辑、批量写库、排查下游数据库瓶颈。


7. Spring / 框架

IoC

IoC 是控制反转,对象创建和依赖管理交给 Spring 容器。开发者通过注解声明 Bean 和依赖,不需要自己 new 对象。

AOP

AOP 是面向切面编程,可以把日志、事务、权限这类横切逻辑从业务代码中抽离出来。Spring AOP 底层主要通过动态代理实现。

事务

Spring 事务基于 AOP,方法执行前开启事务,成功提交,异常回滚。默认只有运行时异常回滚,且同类内部方法调用可能导致事务失效。

自动装配

Spring Boot 根据 classpath 里的依赖和配置条件自动创建 Bean,核心是 starter、自动配置类和条件注解,减少手动配置。

MyBatis

MyBatis 是半自动 ORM 框架,通过 Mapper 接口和 XML/注解写 SQL,适合复杂 SQL 场景。


8. LangChain4j

LangChain4j 是 Java 生态的大模型应用开发框架,可以方便地在 Spring Boot 项目中调用大模型接口。项目里主要用它做短链目标内容的 AI 风控,通过异步调用模型判断目标链接是否存在钓鱼、诈骗或恶意内容风险。

别说训练模型,说:

调用大模型接口,不是自己训练模型。


9. Docker / Linux / Git / Maven

Git

常用命令有 clone、pull、add、commit、push、branch、merge。多人协作一般通过分支开发和 PR 合并。

Maven

Maven 用来做依赖管理和项目构建。常用生命周期有 clean、compile、package、install。多模块项目里 parent 管理版本,子模块继承依赖配置。

Docker

Docker 可以把应用和运行环境打包成镜像,保证不同环境运行一致。常用概念有镜像、容器、Dockerfile、docker-compose。

Linux

常用命令包括 ls、cd、grep、ps、netstat/ss、tail、chmod、kill。部署时会用 nohup 或 systemd 启动 jar,并查看日志排查问题。


你现在最该背的“万能承认句”

如果问深了,你就说:

这块我目前主要掌握到应用和原理层面,源码级细节还没有特别深入。我可以先说一下我的理解。

这句话不丢人。


面试官真问技能清单时,你别说“熟悉”太满

可以主动降一点:

简历上写的这些技术,我主要是围绕项目和后端开发常见场景去学习的。像 Redis、RabbitMQ、Spring Boot、MySQL 这些在项目里用得比较多;JVM、JUC、AQS 这些我主要掌握核心原理和常见面试点,源码层面还在继续学习。

这句非常稳,能降低面试官预期。


最后给你一份 20 秒总括

我的技术栈主要围绕 Java 后端展开,常用的是 Spring Boot、MySQL、Redis、RabbitMQ 和 Spring Cloud 微服务组件。项目里主要实践了 JWT 鉴权、Redis 缓存优化、RabbitMQ 异步削峰、ShardingSphere 分表和 Gateway/Nacos/Feign/Sentinel 微服务治理。对于 JVM、JUC、AQS、JMM 这些底层内容,我掌握核心原理和常见问题,源码细节还在持续补充。

你下午就用这个调子:会的讲项目,不会的讲理解,不硬装源码专家。

✨职务:华夏大地区域代理人 | 熬夜秃头项目主理人 💳黑卡:校园一卡通全球辅导版持有者 📍地点:宇宙-银河系-地球-东北蹲分部 🥂生活方式:沉迷于廉价多巴胺 | 致力于在该醒的时候睡觉 🚫拒绝:拒绝早起 | 拒绝内卷| 拒绝借钱 简介:虽然我没钱,但我有时间;虽然我没才华,但我有脾气。
最后更新于 2026-06-10