一、Java 基础(核心重点)
1. Java 语言核心
- 面向对象:封装、继承、多态、抽象类 vs 接口
- 关键字:final、static、volatile、synchronized、transient、native
- 数据类型:8大基本类型、包装类、自动装箱拆箱、Integer 缓存池(-128~127)
- String:String、StringBuilder、StringBuffer 区别、String 不可变性原理、字符串常量池
- Object 类:equals()、hashCode()、toString()、clone()、finalize()
- == 与 equals 区别
- hashCode 与 equals 的关系
2. 异常处理
- 异常体系:Throwable、Error、Exception
- Checked vs Unchecked 异常
- try-catch-finally 执行顺序(return 情况)
- try-with-resources
- 自定义异常
3. 反射机制
- Class 对象获取方式
- 反射创建对象、调用方法、获取属性
- 反射的应用场景(框架、动态代理)
- 反射的性能问题
4. 泛型
- 泛型类、泛型接口、泛型方法
- 类型擦除
- 通配符:? extends、? super(PECS原则)
- 泛型的限制
5. 注解
- 元注解:@Target、@Retention、@Documented、@Inherited
- 自定义注解
- 注解的应用(Spring、MyBatis 中的注解)
6. I/O 流
- 字节流 vs 字符流
- 节点流 vs 处理流
- BIO、NIO、AIO 区别
- NIO 核心组件:Buffer、Channel、Selector
- 零拷贝:mmap、sendfile
7. 序列化
- Serializable 接口
- serialVersionUID 作用
- transient 关键字
- 其他序列化方式:JSON、Protobuf、Hessian、Kryo
8. Lambda 与 Stream(Java 8+)
- 函数式接口:Consumer、Supplier、Function、Predicate
- Lambda 表达式语法
- 方法引用
- Stream 操作:filter、map、flatMap、reduce、collect
- 并行流 parallelStream
9. Java 新特性
- Java 8:Lambda、Stream、Optional、新日期API
- Java 11:var 局部变量、HTTP Client
- Java 17:Sealed Classes、Pattern Matching
- Java 21:虚拟线程(Virtual Thread)
二、集合框架
1. Collection 体系
| 类型 | 实现类 | 底层结构 | 特点 |
|---|---|---|---|
| List | ArrayList | 数组 | 查询快、增删慢 |
| List | LinkedList | 双向链表 | 增删快、查询慢 |
| List | Vector | 数组 | 线程安全、性能差 |
| Set | HashSet | HashMap | 无序、不重复 |
| Set | LinkedHashSet | 链表+HashMap | 有序、不重复 |
| Set | TreeSet | 红黑树 | 排序、不重复 |
| Queue | PriorityQueue | 堆 | 优先级队列 |
| Queue | ArrayDeque | 数组 | 双端队列 |
2. Map 体系
| 实现类 | 底层结构 | 特点 |
|---|---|---|
| HashMap | 数组+链表+红黑树 | 无序、允许null |
| LinkedHashMap | 数组+链表+红黑树+双向链表 | 有序 |
| TreeMap | 红黑树 | 排序 |
| Hashtable | 数组+链表 | 线程安全、不允许null |
| ConcurrentHashMap | 数组+链表+红黑树 | 线程安全、高性能 |
3. 深入原理
- ArrayList:初始容量、扩容机制(1.5倍)、modCount 快速失败
- LinkedList:双向链表结构、头尾操作
- HashMap :
- 底层结构(数组+链表+红黑树)
- 哈希计算、扰动函数
- put 流程、get 流程
- 扩容机制(2倍)、扩容时机
- 链表转红黑树条件(长度>8 且 数组长度>=64)
- 1.7 vs 1.8 区别(头插法 vs 尾插法、死循环问题)
- 为什么容量是2的幂次
- 负载因子为什么是0.75
- ConcurrentHashMap :
- 1.7 分段锁实现
- 1.8 CAS + synchronized 实现
- size() 如何保证准确性
4. 线程安全集合
- CopyOnWriteArrayList:写时复制、适用读多写少
- CopyOnWriteArraySet
- ConcurrentSkipListMap:跳表实现、有序
- ConcurrentLinkedQueue:无锁队列
- BlockingQueue:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、DelayQueue
5. 工具类
- Collections:sort、reverse、shuffle、synchronizedXxx
- Arrays:sort、binarySearch、copyOf、asList
三、JVM 虚拟机
1. 内存结构
| 区域 | 线程共享 | 存储内容 | 异常 |
|---|---|---|---|
| 堆 | 是 | 对象实例、数组 | OOM |
| 方法区/元空间 | 是 | 类信息、常量、静态变量 | OOM |
| 虚拟机栈 | 否 | 栈帧(局部变量、操作数栈) | SOF/OOM |
| 本地方法栈 | 否 | Native 方法 | SOF/OOM |
| 程序计数器 | 否 | 当前执行的字节码行号 | 无 |
2. 堆内存划分
- 新生代:Eden、Survivor0、Survivor1(8:1:1)
- 老年代
- 对象分配流程:TLAB → Eden → Survivor → 老年代
3. 对象创建过程
- 类加载检查
- 分配内存(指针碰撞/空闲列表)
- 初始化零值
- 设置对象头
- 执行
<init>方法
4. 对象内存布局
- 对象头:Mark Word、类型指针、数组长度
- 实例数据
- 对齐填充
5. 对象访问定位
- 句柄访问
- 直接指针访问(HotSpot 使用)
6. 垃圾回收
判断对象是否存活
- 引用计数法(循环引用问题)
- 可达性分析(GC Roots)
GC Roots 包括
- 虚拟机栈中引用的对象
- 本地方法栈中引用的对象
- 方法区静态属性引用的对象
- 方法区常量引用的对象
- 同步锁持有的对象
引用类型
| 类型 | 回收时机 | 应用场景 |
|---|---|---|
| 强引用 | 不回收 | 普通对象 |
| 软引用 | 内存不足时 | 缓存 |
| 弱引用 | GC 时 | WeakHashMap |
| 虚引用 | GC 时 | 跟踪回收 |
垃圾回收算法
| 算法 | 优点 | 缺点 | 应用 |
|---|---|---|---|
| 标记-清除 | 简单 | 碎片 | CMS |
| 复制 | 无碎片 | 空间浪费 | 新生代 |
| 标记-整理 | 无碎片 | 效率低 | 老年代 |
| 分代收集 | 综合优点 | - | HotSpot |
垃圾收集器
| 收集器 | 区域 | 算法 | 特点 |
|---|---|---|---|
| Serial | 新生代 | 复制 | 单线程、STW |
| ParNew | 新生代 | 复制 | 多线程、STW |
| Parallel Scavenge | 新生代 | 复制 | 吞吐量优先 |
| Serial Old | 老年代 | 标记-整理 | 单线程 |
| Parallel Old | 老年代 | 标记-整理 | 多线程 |
| CMS | 老年代 | 标记-清除 | 低延迟 |
| G1 | 全堆 | 分区+复制+标记整理 | 可控停顿 |
| ZGC | 全堆 | 着色指针+读屏障 | 超低延迟 |
CMS 收集过程
- 初始标记(STW)
- 并发标记
- 重新标记(STW)
- 并发清除
G1 收集过程
- 初始标记(STW)
- 并发标记
- 最终标记(STW)
- 筛选回收(STW)
7. 类加载机制
类加载过程
- 加载:读取字节码、生成 Class 对象
- 验证:文件格式、元数据、字节码、符号引用
- 准备:分配内存、设置零值
- 解析:符号引用转直接引用
- 初始化 :执行
<clinit>方法
类加载器
| 加载器 | 加载路径 |
|---|---|
| Bootstrap ClassLoader | JAVA_HOME/lib |
| Extension ClassLoader | JAVA_HOME/lib/ext |
| Application ClassLoader | classpath |
| 自定义 ClassLoader | 自定义路径 |
双亲委派模型
- 工作流程:向上委派、向下加载
- 作用:避免重复加载、安全性
- 打破双亲委派:SPI、Tomcat、OSGi
8. JVM 调优
常用参数
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:新生代大小
-XX:MetaspaceSize:元空间初始大小
-XX:MaxMetaspaceSize:元空间最大大小
-XX:+UseG1GC:使用 G1 收集器
-XX:MaxGCPauseMillis:最大 GC 停顿时间
-XX:+PrintGCDetails:打印 GC 详情
-XX:+HeapDumpOnOutOfMemoryError:OOM 时 dump 堆
常见问题排查
- OOM 排查:jmap、MAT、VisualVM
- CPU 过高:top、jstack
- GC 频繁:jstat、GC 日志分析
常用工具
| 工具 | 用途 |
|---|---|
| jps | 查看 Java 进程 |
| jinfo | 查看/修改 JVM 参数 |
| jstat | 监控 GC 状态 |
| jstack | 查看线程堆栈 |
| jmap | 内存映射、dump 堆 |
| jconsole | 图形化监控 |
| VisualVM | 综合监控 |
| Arthas | 在线诊断 |
四、多线程与并发
1. 线程基础
创建线程的方式
- 继承 Thread 类
- 实现 Runnable 接口
- 实现 Callable 接口
- 线程池
线程状态
| 状态 | 说明 |
|---|---|
| NEW | 新建 |
| RUNNABLE | 可运行 |
| BLOCKED | 阻塞 |
| WAITING | 等待 |
| TIMED_WAITING | 超时等待 |
| TERMINATED | 终止 |
常见方法对比
| 方法 | 所属 | 释放锁 | 唤醒方式 |
|---|---|---|---|
| sleep | Thread | 否 | 超时自动 |
| wait | Object | 是 | notify/notifyAll |
| yield | Thread | 否 | 自动 |
| join | Thread | - | 目标线程结束 |
| park | LockSupport | 否 | unpark |
2. 线程池
核心参数
| 参数 | 说明 |
|---|---|
| corePoolSize | 核心线程数 |
| maximumPoolSize | 最大线程数 |
| keepAliveTime | 空闲线程存活时间 |
| unit | 时间单位 |
| workQueue | 工作队列 |
| threadFactory | 线程工厂 |
| handler | 拒绝策略 |
工作流程
- 提交任务
- 核心线程未满 → 创建核心线程执行
- 核心线程已满 → 加入队列
- 队列已满 → 创建非核心线程执行
- 达到最大线程数 → 执行拒绝策略
拒绝策略
| 策略 | 说明 |
|---|---|
| AbortPolicy | 抛出异常(默认) |
| CallerRunsPolicy | 调用者执行 |
| DiscardPolicy | 静默丢弃 |
| DiscardOldestPolicy | 丢弃最老任务 |
工作队列
| 队列 | 特点 |
|---|---|
| ArrayBlockingQueue | 有界数组队列 |
| LinkedBlockingQueue | 可选有界链表队列 |
| SynchronousQueue | 不存储元素 |
| PriorityBlockingQueue | 优先级队列 |
| DelayQueue | 延迟队列 |
预定义线程池(不推荐直接使用)
| 线程池 | 特点 | 问题 |
|---|---|---|
| FixedThreadPool | 固定线程数 | 队列无界,OOM |
| SingleThreadExecutor | 单线程 | 队列无界,OOM |
| CachedThreadPool | 可缓存线程 | 线程数无限,OOM |
| ScheduledThreadPool | 定时调度 | 线程数无限 |
线程池大小设置
- CPU 密集型:N + 1(N 为 CPU 核数)
- IO 密集型:2N 或 N * (1 + W/C)
3. 锁机制
synchronized
- 使用方式:修饰方法、修饰代码块
- 锁对象:普通方法锁 this、静态方法锁 Class、代码块锁指定对象
- 底层原理:monitorenter、monitorexit
- 锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁
- 锁优化:锁消除、锁粗化、自适应自旋
ReentrantLock
- 与 synchronized 区别
| 特性 | synchronized | ReentrantLock |
|---|---|---|
| 实现 | JVM | API |
| 释放锁 | 自动 | 手动 |
| 可中断 | 否 | 是 |
| 公平锁 | 否 | 可选 |
| 条件变量 | 1个 | 多个 |
- 公平锁 vs 非公平锁
- Condition 条件变量
读写锁
- ReentrantReadWriteLock
- 读读共享、读写互斥、写写互斥
- 锁降级
StampedLock
- 乐观读
- 比读写锁性能更好
4. AQS(AbstractQueuedSynchronizer)
- 核心思想:CLH 队列 + state 状态
- 独占模式:ReentrantLock
- 共享模式:Semaphore、CountDownLatch
- 源码分析:acquire、release、acquireShared、releaseShared
5. 并发工具类
| 工具类 | 作用 | 场景 |
|---|---|---|
| CountDownLatch | 倒计时器 | 主线程等待多个子线程完成 |
| CyclicBarrier | 循环屏障 | 多个线程互相等待到达屏障点 |
| Semaphore | 信号量 | 限制并发访问资源数量 |
| Exchanger | 交换器 | 两个线程交换数据 |
| Phaser | 阶段器 | 分阶段任务 |
6. 原子类
| 类型 | 类 |
|---|---|
| 基本类型 | AtomicInteger、AtomicLong、AtomicBoolean |
| 引用类型 | AtomicReference、AtomicStampedReference、AtomicMarkableReference |
| 数组类型 | AtomicIntegerArray、AtomicLongArray |
| 字段更新 | AtomicIntegerFieldUpdater |
| 累加器 | LongAdder、LongAccumulator |
- CAS 原理:Compare And Swap
- ABA 问题:AtomicStampedReference 解决
- LongAdder vs AtomicLong:分段累加,高并发更优
7. volatile
- 可见性:修改立即刷新到主内存
- 有序性:禁止指令重排(内存屏障)
- 不保证原子性
- 应用场景:状态标志、双重检查锁定
8. ThreadLocal
- 原理:每个线程维护 ThreadLocalMap
- 内存泄漏:key 弱引用、value 强引用
- 解决方案:使用后调用 remove()
- 应用场景:数据库连接、用户信息传递
- InheritableThreadLocal:父子线程传递
- TransmittableThreadLocal:线程池场景
9. 并发设计模式
- 不可变模式:Immutable
- 生产者-消费者模式
- Future 模式
- Worker Thread 模式
- 两阶段终止模式
五、MySQL
1. SQL 基础
- DDL:CREATE、ALTER、DROP、TRUNCATE
- DML:INSERT、UPDATE、DELETE
- DQL:SELECT、JOIN、子查询、聚合函数、分组、排序
- DCL:GRANT、REVOKE
2. 数据类型
| 类型 | 说明 |
|---|---|
| INT | 整数 |
| BIGINT | 大整数 |
| DECIMAL | 精确小数 |
| VARCHAR | 变长字符串 |
| TEXT | 长文本 |
| DATETIME | 日期时间 |
| TIMESTAMP | 时间戳 |
3. 存储引擎
| 引擎 | 事务 | 行锁 | 外键 | 场景 |
|---|---|---|---|---|
| InnoDB | 支持 | 支持 | 支持 | 默认、OLTP |
| MyISAM | 不支持 | 不支持 | 不支持 | 读多写少 |
| Memory | 不支持 | 不支持 | 不支持 | 临时表 |
4. 索引
索引类型
| 类型 | 说明 |
|---|---|
| 主键索引 | 聚簇索引 |
| 唯一索引 | 值唯一 |
| 普通索引 | 最常用 |
| 联合索引 | 多列组合 |
| 全文索引 | 文本搜索 |
| 前缀索引 | 字符串前缀 |
B+ 树特点
- 非叶子节点只存索引
- 叶子节点存数据,并用链表连接
- 层数少,IO 次数少
聚簇索引 vs 非聚簇索引
| 类型 | 叶子节点存储 | 回表 |
|---|---|---|
| 聚簇索引 | 完整数据行 | 不需要 |
| 非聚簇索引 | 主键值 | 需要 |
覆盖索引
- 查询的列都在索引中
- 避免回表
最左前缀原则
- 联合索引按最左字段匹配
- 范围查询后面的列无法使用索引
索引失效场景
- 使用函数或计算
- 隐式类型转换
- LIKE 以 % 开头
- OR 连接非索引列
- 不符合最左前缀
- 使用 != 或 NOT IN
- IS NULL / IS NOT NULL(看情况)
索引优化
- 选择性高的列建索引
- 联合索引考虑顺序
- 避免冗余索引
- 前缀索引节省空间
5. 事务
ACID 特性
| 特性 | 说明 | 实现 |
|---|---|---|
| 原子性 | 全部成功或全部失败 | undo log |
| 一致性 | 数据保持一致状态 | 其他三个特性保证 |
| 隔离性 | 事务间相互隔离 | MVCC + 锁 |
| 持久性 | 提交后永久保存 | redo log |
隔离级别
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | 有 | 有 | 有 |
| READ COMMITTED | 无 | 有 | 有 |
| REPEATABLE READ | 无 | 无 | 有(InnoDB 部分解决) |
| SERIALIZABLE | 无 | 无 | 无 |
6. MVCC
- 实现:隐藏列(trx_id、roll_pointer)+ undo log + ReadView
- ReadView:活跃事务列表、最小/最大事务ID
- RC vs RR:ReadView 生成时机不同
7. 锁机制
锁类型
| 锁 | 说明 |
|---|---|
| 共享锁(S锁) | 读锁 |
| 排他锁(X锁) | 写锁 |
| 意向锁 | 表级锁标志 |
| 记录锁 | 锁定单行 |
| 间隙锁 | 锁定范围间隙 |
| 临键锁 | 记录锁 + 间隙锁 |
死锁
- 产生条件:互斥、占有等待、不可抢占、循环等待
- 排查:SHOW ENGINE INNODB STATUS
- 解决:超时、死锁检测
8. 日志
| 日志 | 层级 | 作用 |
|---|---|---|
| redo log | InnoDB | 崩溃恢复、持久性 |
| undo log | InnoDB | 事务回滚、MVCC |
| binlog | Server | 主从复制、数据恢复 |
binlog 格式
- Statement:记录 SQL 语句
- Row:记录行变更
- Mixed:混合模式
9. SQL 优化
EXPLAIN 字段
| 字段 | 说明 |
|---|---|
| id | 查询序号 |
| select_type | 查询类型 |
| table | 表名 |
| type | 访问类型(system > const > eq_ref > ref > range > index > ALL) |
| possible_keys | 可能使用的索引 |
| key | 实际使用的索引 |
| key_len | 索引长度 |
| rows | 预估扫描行数 |
| Extra | 额外信息 |
优化技巧
- 避免 SELECT *
- 使用覆盖索引
- 小表驱动大表
- 批量操作代替循环
- 分页优化(延迟关联)
- 避免深度分页
10. 分库分表
- 垂直分库:按业务拆分
- 垂直分表:按字段拆分
- 水平分库:按数据拆分
- 水平分表:按数据拆分
- 分片策略:哈希、范围、时间
- 分布式 ID:雪花算法
- 跨库问题:事务、JOIN、排序分页
- 中间件:ShardingSphere、MyCat
11. 主从复制
- 原理:binlog → relay log → 数据回放
- 模式:异步、半同步、全同步
- 延迟问题:原因与解决方案
六、Redis
1. 数据类型与应用场景
| 类型 | 底层结构 | 应用场景 |
|---|---|---|
| String | SDS | 缓存、计数器、分布式锁 |
| Hash | 压缩列表/哈希表 | 对象存储 |
| List | 压缩列表/双向链表 | 消息队列、文章列表 |
| Set | 整数集合/哈希表 | 标签、共同好友 |
| ZSet | 压缩列表/跳表+哈希表 | 排行榜、延迟队列 |
| Bitmap | String | 签到、在线状态 |
| HyperLogLog | 稀疏/稠密编码 | UV 统计 |
| GEO | ZSet | 地理位置 |
| Stream | 基数树 | 消息队列 |
2. 底层数据结构
- SDS:简单动态字符串
- 压缩列表:ziplist
- 快速列表:quicklist
- 跳表:skiplist
- 整数集合:intset
- 哈希表:dictht
- listpack:Redis 7.0 替代 ziplist
3. 持久化
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| RDB | 快照 | 恢复快、文件小 | 可能丢数据 |
| AOF | 日志追加 | 数据安全 | 文件大、恢复慢 |
| 混合持久化 | RDB + AOF | 兼顾两者优点 | - |
AOF 同步策略
| 策略 | 说明 |
|---|---|
| always | 每次写入都同步 |
| everysec | 每秒同步(默认) |
| no | 操作系统决定 |
AOF 重写
- 作用:压缩 AOF 文件
- 触发:手动或自动
4. 内存管理
过期策略
- 惰性删除:访问时检查
- 定期删除:随机抽取检查
内存淘汰策略
| 策略 | 说明 |
|---|---|
| noeviction | 不淘汰,报错 |
| allkeys-lru | 所有 key 的 LRU |
| volatile-lru | 设置过期的 key 的 LRU |
| allkeys-lfu | 所有 key 的 LFU |
| volatile-lfu | 设置过期的 key 的 LFU |
| allkeys-random | 随机淘汰 |
| volatile-random | 随机淘汰设置过期的 |
| volatile-ttl | 淘汰即将过期的 |
5. 缓存问题
| 问题 | 说明 | 解决方案 |
|---|---|---|
| 缓存穿透 | 查询不存在的数据 | 布隆过滤器、空值缓存 |
| 缓存击穿 | 热点 key 过期 | 互斥锁、不过期+后台更新 |
| 缓存雪崩 | 大量 key 同时过期 | 随机过期时间、多级缓存 |
6. 数据一致性
- Cache Aside:旁路缓存模式
- 先更新数据库,再删缓存
- 延迟双删
- 订阅 binlog
7. 分布式锁
- SETNX + EXPIRE:非原子问题
- SET NX EX:原子设置
- Redisson:可重入、看门狗续期
- RedLock:多节点加锁
8. 集群模式
| 模式 | 说明 | 优缺点 |
|---|---|---|
| 主从复制 | 读写分离 | 手动故障转移 |
| 哨兵模式 | 自动故障转移 | 不支持分片 |
| Cluster | 分片 + 高可用 | 官方推荐 |
Cluster 集群
- 哈希槽:16384 个槽
- 节点通信:Gossip 协议
- 故障转移:主观下线 → 客观下线 → 选举
9. 其他特性
- Pipeline:批量命令
- Lua 脚本:原子执行
- 事务:MULTI/EXEC(弱事务)
- 发布订阅:Pub/Sub
七、Spring 全家桶
1. Spring 核心
IoC(控制反转)
- 概念:将对象创建和依赖管理交给容器
- DI 方式:构造器注入、Setter 注入、字段注入
- 注解:@Autowired、@Resource、@Inject
Bean 生命周期
- 实例化
- 属性填充
- Aware 接口回调
- BeanPostProcessor 前置处理
- InitializingBean / @PostConstruct
- BeanPostProcessor 后置处理
- 使用
- DisposableBean / @PreDestroy
- 销毁
Bean 作用域
| 作用域 | 说明 |
|---|---|
| singleton | 单例(默认) |
| prototype | 原型 |
| request | 每个请求 |
| session | 每个会话 |
| application | 每个应用 |
循环依赖
- 三级缓存解决 :
- singletonObjects:完整 Bean
- earlySingletonObjects:早期 Bean
- singletonFactories:Bean 工厂
- 构造器注入无法解决
AOP(面向切面编程)
- 概念:将横切关注点与业务逻辑分离
- 术语:切面、连接点、切入点、通知、织入
- 通知类型:前置、后置、返回、异常、环绕
- 实现方式:JDK 动态代理、CGLIB
动态代理
| 方式 | 条件 | 原理 |
|---|---|---|
| JDK | 实现接口 | 反射 |
| CGLIB | 无需接口 | 字节码生成子类 |
事务
- 传播机制:
| 类型 | 说明 |
|---|---|
| REQUIRED | 有则加入,无则新建(默认) |
| REQUIRES_NEW | 新建事务,挂起当前 |
| SUPPORTS | 有则加入,无则不使用 |
| NOT_SUPPORTED | 不使用事务 |
| MANDATORY | 必须有事务 |
| NEVER | 不能有事务 |
| NESTED | 嵌套事务 |
- @Transactional 失效场景 :
- 非 public 方法
- 同类方法调用
- 异常被捕获
- 异常类型不对
- 多线程调用
设计模式在 Spring 中的应用
| 模式 | 应用 |
|---|---|
| 单例模式 | Bean 默认单例 |
| 工厂模式 | BeanFactory |
| 代理模式 | AOP |
| 模板方法 | JdbcTemplate |
| 观察者模式 | 事件机制 |
| 适配器模式 | HandlerAdapter |
| 策略模式 | Resource 接口 |
2. Spring MVC
执行流程
- 请求到达 DispatcherServlet
- HandlerMapping 找到 Handler
- HandlerAdapter 执行 Handler
- 返回 ModelAndView
- ViewResolver 解析视图
- 渲染视图返回响应
核心组件
| 组件 | 作用 |
|---|---|
| DispatcherServlet | 前端控制器 |
| HandlerMapping | 处理器映射 |
| HandlerAdapter | 处理器适配器 |
| Handler | 处理器(Controller) |
| ViewResolver | 视图解析器 |
| View | 视图 |
常用注解
| 注解 | 作用 |
|---|---|
| @Controller | 控制器 |
| @RestController | @Controller + @ResponseBody |
| @RequestMapping | 请求映射 |
| @GetMapping/PostMapping | GET/POST 请求 |
| @RequestParam | 请求参数 |
| @PathVariable | 路径参数 |
| @RequestBody | 请求体 |
| @ResponseBody | 响应体 |
3. Spring Boot
自动装配原理
- @SpringBootApplication 包含 @EnableAutoConfiguration
- @EnableAutoConfiguration 导入 AutoConfigurationImportSelector
- 加载 META-INF/spring.factories 中的自动配置类
- 根据 @Conditional 条件判断是否生效
启动流程
- 创建 SpringApplication 对象
- 运行 run() 方法
- 准备环境 Environment
- 创建 ApplicationContext
- 刷新容器
- 执行 Runner
常用注解
| 注解 | 作用 |
|---|---|
| @SpringBootApplication | 主启动类 |
| @Configuration | 配置类 |
| @Bean | 定义 Bean |
| @Value | 注入配置值 |
| @ConfigurationProperties | 批量绑定配置 |
| @Conditional | 条件装配 |
| @Import | 导入配置类 |
自定义 Starter
- 创建自动配置类
- 使用 @Conditional 控制生效
- 创建 spring.factories 文件
- 打包发布
4. MyBatis
核心组件
| 组件 | 作用 |
|---|---|
| SqlSessionFactory | 创建 SqlSession |
| SqlSession | 执行 SQL |
| Executor | 执行器 |
| StatementHandler | SQL 处理器 |
| ParameterHandler | 参数处理器 |
| ResultSetHandler | 结果集处理器 |
| TypeHandler | 类型处理器 |
执行流程
- 读取配置文件
- 构建 SqlSessionFactory
- 创建 SqlSession
- 获取 Mapper 代理对象
- 执行 SQL
- 返回结果
#{} vs ${}
| 符号 | 方式 | SQL 注入 |
|---|---|---|
| #{} | 预编译 | 安全 |
| ${} | 字符串替换 | 不安全 |
缓存
| 级别 | 范围 | 默认 |
|---|---|---|
| 一级缓存 | SqlSession | 开启 |
| 二级缓存 | namespace | 关闭 |
动态 SQL
- if、choose/when/otherwise
- where、set、trim
- foreach
- sql、include
分页
- 逻辑分页:RowBounds
- 物理分页:PageHelper
八、分布式与微服务
1. 分布式理论
CAP 理论
| 特性 | 说明 |
|---|---|
| C(一致性) | 所有节点数据一致 |
| A(可用性) | 每个请求都能得到响应 |
| P(分区容错) | 网络分区时系统继续工作 |
- 只能满足两个:CP 或 AP
- 常见选择:Zookeeper(CP)、Eureka(AP)
BASE 理论
- BA(Basically Available):基本可用
- S(Soft state):软状态
- E(Eventually consistent):最终一致性
一致性模型
- 强一致性
- 弱一致性
- 最终一致性
2. 注册中心
| 组件 | 公司 | 一致性 | 特点 |
|---|---|---|---|
| Eureka | Netflix | AP | 已停更 |
| Zookeeper | Apache | CP | 强一致 |
| Nacos | Alibaba | AP/CP | 阿里推荐 |
| Consul | HashiCorp | CP | 多数据中心 |
3. 配置中心
| 组件 | 特点 |
|---|---|
| Nacos Config | 动态刷新、分组命名空间 |
| Apollo | 灰度发布、权限管理 |
| Spring Cloud Config | Git 存储 |
4. 服务调用
| 组件 | 方式 | 特点 |
|---|---|---|
| RestTemplate | HTTP | 简单直接 |
| Feign/OpenFeign | HTTP | 声明式、集成 Ribbon |
| Dubbo | RPC | 高性能 |
| gRPC | RPC | 跨语言、Protobuf |
5. 负载均衡
| 组件 | 方式 |
|---|---|
| Ribbon | 客户端负载均衡 |
| LoadBalancer | Spring Cloud 官方 |
| Nginx | 服务端负载均衡 |
负载均衡策略
- 轮询、加权轮询
- 随机、加权随机
- 最少连接
- IP Hash
- 一致性 Hash
6. 服务网关
| 组件 | 特点 |
|---|---|
| Zuul | Netflix、阻塞式 |
| Gateway | Spring Cloud、响应式 |
| Kong | 高性能、插件丰富 |
| APISIX | 云原生 |
功能
- 路由转发
- 负载均衡
- 限流熔断
- 认证鉴权
- 日志监控
7. 熔断限流
| 组件 | 公司 | 特点 |
|---|---|---|
| Hystrix | Netflix | 已停更 |
| Sentinel | Alibaba | 功能丰富、控制台 |
| Resilience4j | - | 轻量级 |
Sentinel 核心概念
- 资源:需要保护的服务/方法
- 规则:流控规则、降级规则、系统规则
- 流控效果:直接拒绝、Warm Up、排队等待
8. 分布式事务
| 方案 | 一致性 | 性能 | 复杂度 |
|---|---|---|---|
| 2PC | 强 | 低 | 低 |
| 3PC | 强 | 低 | 中 |
| TCC | 最终 | 高 | 高 |
| SAGA | 最终 | 高 | 高 |
| 本地消息表 | 最终 | 高 | 中 |
| 可靠消息 | 最终 | 高 | 中 |
| 最大努力通知 | 最终 | 高 | 低 |
Seata
- AT 模式:无侵入、自动补偿
- TCC 模式:try-confirm-cancel
- SAGA 模式:长事务
- XA 模式:强一致
9. 分布式 ID
| 方案 | 优点 | 缺点 |
|---|---|---|
| UUID | 简单 | 无序、太长 |
| 数据库自增 | 简单 | 性能瓶颈 |
| Redis INCR | 性能好 | 依赖 Redis |
| 雪花算法 | 有序、高性能 | 时钟回拨问题 |
| Leaf/Tinyid | 高可用 | 额外部署 |
雪花算法结构
- 1 bit 符号位
- 41 bit 时间戳
- 10 bit 机器 ID
- 12 bit 序列号
10. 分布式锁
| 方案 | 优点 | 缺点 |
|---|---|---|
| MySQL | 简单 | 性能低 |
| Redis | 性能高 | 可靠性问题 |
| Zookeeper | 可靠 | 性能一般 |
| etcd | 可靠 | 复杂 |
九、消息队列
1. 基础概念
- 为什么用 MQ:解耦、异步、削峰
- 缺点:复杂度增加、一致性问题、可用性降低
2. 常见 MQ 对比
| MQ | 语言 | 吞吐量 | 延迟 | 特点 |
|---|---|---|---|---|
| RabbitMQ | Erlang | 万级 | 微秒 | 功能完善、AMQP |
| RocketMQ | Java | 十万级 | 毫秒 | 阿里出品、事务消息 |
| Kafka | Scala | 百万级 | 毫秒 | 日志收集、大数据 |
| Pulsar | Java | 百万级 | 毫秒 | 云原生、计算存储分离 |
3. RabbitMQ
Exchange 类型
| 类型 | 路由方式 |
|---|---|
| Direct | 精确匹配 routing key |
| Fanout | 广播到所有队列 |
| Topic | 模糊匹配 routing key |
| Headers | 根据 headers 匹配 |
消息确认机制
- 生产者确认:confirm 模式
- 消费者确认:手动 ack
4. RocketMQ
核心概念
- NameServer:注册中心
- Broker:消息存储
- Producer:生产者
- Consumer:消费者
- Topic:主题
- Tag:标签
- Message Queue:队列
消息类型
- 普通消息
- 顺序消息
- 延迟消息
- 事务消息
- 批量消息
5. Kafka
核心概念
- Broker:节点
- Topic:主题
- Partition:分区
- Replica:副本
- Producer:生产者
- Consumer:消费者
- Consumer Group:消费组
- Offset:偏移量
高性能原因
- 顺序写磁盘
- 零拷贝
- 分区并行
- 批量发送
- 压缩
6. 核心问题与解决方案
消息丢失
| 环节 | 解决方案 |
|---|---|
| 生产者 | 确认机制、重试 |
| Broker | 持久化、副本 |
| 消费者 | 手动 ACK |
重复消费
- 原因:网络问题、重试机制
- 解决 :幂等性设计
- 唯一 ID + 去重表
- 状态机
- 乐观锁
顺序消费
- 全局有序:单分区
- 局部有序:相同 key 同一分区
消息堆积
- 增加消费者
- 批量消费
- 跳过非重要消息
- 转存后续处理
十、计算机网络
1. 网络分层模型
| OSI 七层 | TCP/IP 四层 | 协议 |
|---|---|---|
| 应用层 | 应用层 | HTTP、FTP、DNS |
| 表示层 | 应用层 | - |
| 会话层 | 应用层 | - |
| 传输层 | 传输层 | TCP、UDP |
| 网络层 | 网络层 | IP、ICMP |
| 数据链路层 | 网络接口层 | ARP |
| 物理层 | 网络接口层 | - |
2. TCP
三次握手
- 客户端 → SYN → 服务端
- 服务端 → SYN+ACK → 客户端
- 客户端 → ACK → 服务端
为什么三次:确认双方收发能力
四次挥手
- 客户端 → FIN → 服务端
- 服务端 → ACK → 客户端
- 服务端 → FIN → 客户端
- 客户端 → ACK → 服务端
为什么四次:服务端可能还有数据要发送
TIME_WAIT
- 时间:2MSL
- 作用:确保最后 ACK 到达、让旧连接消失
TCP 特性
- 面向连接
- 可靠传输
- 流量控制(滑动窗口)
- 拥塞控制(慢启动、拥塞避免、快重传、快恢复)
3. TCP vs UDP
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠 | 不可靠 |
| 速度 | 慢 | 快 |
| 场景 | HTTP、FTP | DNS、视频 |
4. HTTP
HTTP 方法
| 方法 | 作用 | 幂等 | 安全 |
|---|---|---|---|
| GET | 获取资源 | 是 | 是 |
| POST | 提交数据 | 否 | 否 |
| PUT | 更新资源 | 是 | 否 |
| DELETE | 删除资源 | 是 | 否 |
| PATCH | 部分更新 | 否 | 否 |
GET vs POST
| 方面 | GET | POST |
|---|---|---|
| 参数位置 | URL | Body |
| 长度限制 | 有(浏览器) | 无 |
| 幂等性 | 是 | 否 |
| 缓存 | 可以 | 不可以 |
状态码
| 分类 | 含义 | 常见 |
|---|---|---|
| 1xx | 信息 | 100 Continue |
| 2xx | 成功 | 200 OK、201 Created |
| 3xx | 重定向 | 301、302、304 |
| 4xx | 客户端错误 | 400、401、403、404 |
| 5xx | 服务端错误 | 500、502、503 |
HTTP 版本
| 版本 | 特点 |
|---|---|
| HTTP/1.0 | 短连接 |
| HTTP/1.1 | 持久连接、管道化 |
| HTTP/2 | 多路复用、头部压缩、服务器推送 |
| HTTP/3 | QUIC 协议、基于 UDP |
5. HTTPS
-
加密过程:
- 客户端请求,发送支持的加密套件
- 服务端返回证书和公钥
- 客户端验证证书
- 客户端生成对称密钥,用公钥加密发送
- 双方使用对称密钥通信
-
对称加密 vs 非对称加密:
| 类型 | 速度 | 安全性 | 用途 |
|---|---|---|---|
| 对称加密 | 快 | 密钥分发难 | 数据加密 |
| 非对称加密 | 慢 | 安全 | 密钥交换 |
6. DNS
- 解析过程:浏览器缓存 → 本地 hosts → 本地 DNS → 根 DNS → 顶级 DNS → 权威 DNS
- 记录类型:A、AAAA、CNAME、MX、NS
7. Cookie vs Session vs Token
| 类型 | 存储位置 | 安全性 | 跨域 |
|---|---|---|---|
| Cookie | 客户端 | 低 | 不支持 |
| Session | 服务端 | 高 | 不支持 |
| Token | 客户端 | 较高 | 支持 |
8. JWT
- 结构:Header.Payload.Signature
- 优点:无状态、跨域
- 缺点:无法主动失效、体积大
十一、操作系统
1. 进程与线程
| 对比 | 进程 | 线程 |
|---|---|---|
| 定义 | 资源分配单位 | CPU 调度单位 |
| 资源 | 独立地址空间 | 共享进程资源 |
| 切换 | 开销大 | 开销小 |
| 通信 | IPC | 直接通信 |
2. 进程间通信(IPC)
| 方式 | 特点 |
|---|---|
| 管道 | 单向、父子进程 |
| 命名管道 | 双向、任意进程 |
| 消息队列 | 异步 |
| 共享内存 | 最快 |
| 信号量 | 同步 |
| Socket | 网络通信 |
3. 进程调度算法
| 算法 | 特点 |
|---|---|
| FCFS | 先来先服务 |
| SJF | 短作业优先 |
| 优先级调度 | 按优先级 |
| 时间片轮转 | 公平 |
| 多级反馈队列 | 综合 |
4. 死锁
产生条件
- 互斥
- 占有等待
- 不可抢占
- 循环等待
处理方法
- 预防:破坏四个条件之一
- 避免:银行家算法
- 检测:资源分配图
- 解除:终止进程、资源剥夺
5. 内存管理
- 分页:固定大小页
- 分段:按逻辑段
- 段页式:段内分页
页面置换算法
| 算法 | 特点 |
|---|---|
| FIFO | 先进先出 |
| LRU | 最近最少使用 |
| LFU | 最不经常使用 |
| OPT | 最优(理论) |
6. 虚拟内存
- 概念:使用磁盘扩展内存
- 页表:虚拟页 → 物理页
- 缺页中断:页面不在内存时触发
十二、数据结构与算法
1. 数据结构
| 结构 | 特点 | 应用 |
|---|---|---|
| 数组 | 连续存储、随机访问 | ArrayList |
| 链表 | 非连续、增删快 | LinkedList |
| 栈 | LIFO | 函数调用、括号匹配 |
| 队列 | FIFO | BFS、消息队列 |
| 哈希表 | O(1) 查找 | HashMap |
| 二叉树 | 层级结构 | 索引、表达式 |
| 红黑树 | 平衡二叉搜索树 | TreeMap |
| B+ 树 | 多路平衡 | 数据库索引 |
| 堆 | 优先级队列 | 排序、Top K |
| 图 | 关系网络 | 社交网络、路径规划 |
| 跳表 | 有序链表 | Redis ZSet |
| 字典树 | 前缀匹配 | 搜索提示 |
| 布隆过滤器 | 概率判断存在 | 防缓存穿透 |
2. 排序算法
| 算法 | 平均时间 | 最坏时间 | 空间 | 稳定 |
|---|---|---|---|---|
| 冒泡排序 | O(n²) | O(n²) | O(1) | 稳定 |
| 选择排序 | O(n²) | O(n²) | O(1) | 不稳定 |
| 插入排序 | O(n²) | O(n²) | O(1) | 稳定 |
| 希尔排序 | O(nlogn) | O(n²) | O(1) | 不稳定 |
| 归并排序 | O(nlogn) | O(nlogn) | O(n) | 稳定 |
| 快速排序 | O(nlogn) | O(n²) | O(logn) | 不稳定 |
| 堆排序 | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
| 计数排序 | O(n+k) | O(n+k) | O(k) | 稳定 |
| 桶排序 | O(n+k) | O(n²) | O(n+k) | 稳定 |
| 基数排序 | O(nk) | O(nk) | O(n+k) | 稳定 |
3. 常见算法思想
| 思想 | 说明 | 应用 |
|---|---|---|
| 双指针 | 首尾指针、快慢指针 | 两数之和、链表环 |
| 滑动窗口 | 动态维护窗口 | 最长子串 |
| 二分查找 | 有序数组查找 | 查找、边界问题 |
| 递归/回溯 | 穷举所有可能 | 排列组合、N皇后 |
| 贪心 | 局部最优 | 活动选择、霍夫曼 |
| 动态规划 | 重叠子问题、最优子结构 | 背包问题、最长子序列 |
| 分治 | 分解→解决→合并 | 归并排序、快排 |
| BFS | 层序遍历 | 最短路径 |
| DFS | 深度优先 | 路径问题 |
4. LeetCode 高频题型
| 类型 | 经典题目 |
|---|---|
| 数组 | 两数之和、三数之和、移动零 |
| 链表 | 反转链表、环形链表、合并链表 |
| 栈/队列 | 有效括号、最小栈、滑动窗口最大值 |
| 哈希表 | 字母异位词、两数之和 |
| 字符串 | 最长回文子串、无重复字符最长子串 |
| 二叉树 | 遍历、最大深度、层序遍历、验证BST |
| 动态规划 | 爬楼梯、最长递增子序列、背包问题 |
| 回溯 | 全排列、组合、子集 |
| 贪心 | 跳跃游戏、分发糖果 |
| 二分 | 搜索旋转数组、寻找峰值 |
十三、设计模式
1. 创建型模式
| 模式 | 说明 | 应用 |
|---|---|---|
| 单例模式 | 唯一实例 | Spring Bean |
| 工厂方法 | 延迟到子类创建 | Collection.iterator() |
| 抽象工厂 | 创建产品族 | 数据库驱动 |
| 建造者模式 | 分步骤创建 | StringBuilder |
| 原型模式 | 克隆对象 | Object.clone() |
单例模式实现
- 饿汉式
- 懒汉式(双重检查锁)
- 静态内部类
- 枚举
2. 结构型模式
| 模式 | 说明 | 应用 |
|---|---|---|
| 代理模式 | 控制访问 | AOP |
| 适配器模式 | 接口转换 | InputStreamReader |
| 装饰器模式 | 动态添加功能 | IO 流 |
| 外观模式 | 统一接口 | SLF4J |
| 桥接模式 | 抽象与实现分离 | JDBC |
| 组合模式 | 树形结构 | 文件目录 |
| 享元模式 | 共享对象 | String 常量池 |
3. 行为型模式
| 模式 | 说明 | 应用 |
|---|---|---|
| 策略模式 | 算法封装 | Comparator |
| 模板方法 | 定义骨架 | JdbcTemplate |
| 观察者模式 | 发布-订阅 | Spring 事件 |
| 责任链模式 | 链式处理 | Filter |
| 状态模式 | 状态决定行为 | 订单状态 |
| 命令模式 | 请求封装 | Runnable |
| 迭代器模式 | 遍历集合 | Iterator |
| 中介者模式 | 集中交互 | MVC 中的 C |
| 备忘录模式 | 状态保存 | 游戏存档 |
| 解释器模式 | 语法解释 | 正则表达式 |
| 访问者模式 | 分离数据和操作 | 编译器 AST |
十四、Linux 与运维
1. 常用命令
| 类型 | 命令 |
|---|---|
| 文件操作 | ls、cd、cp、mv、rm、mkdir、touch |
| 文件查看 | cat、less、more、head、tail、vim |
| 文件查找 | find、locate、which |
| 文本处理 | grep、awk、sed、sort、uniq、wc |
| 压缩解压 | tar、gzip、zip、unzip |
| 权限管理 | chmod、chown、chgrp |
| 进程管理 | ps、top、kill、nohup、& |
| 网络相关 | ping、curl、wget、netstat、ss、ifconfig |
| 系统信息 | uname、df、du、free、uptime |
| 用户管理 | useradd、passwd、su、sudo |
2. 日志查看
bash
# 实时查看日志
tail -f app.log
# 查看最后 100 行
tail -n 100 app.log
# 搜索关键字
grep "ERROR" app.log
# 搜索关键字并显示上下文
grep -C 5 "Exception" app.log
3. 性能排查
bash
# CPU 使用率
top
htop
# 内存使用
free -h
# 磁盘使用
df -h
# IO 监控
iostat
# 网络监控
netstat -anp
ss -anp
4. Shell 脚本基础
- 变量、条件判断、循环
- 函数定义
- 常用操作
十五、开发工具
1. Git
| 命令 | 作用 |
|---|---|
| git clone | 克隆仓库 |
| git add | 添加到暂存区 |
| git commit | 提交 |
| git push | 推送 |
| git pull | 拉取 |
| git branch | 分支管理 |
| git checkout | 切换分支 |
| git merge | 合并分支 |
| git rebase | 变基 |
| git stash | 暂存修改 |
| git reset | 重置 |
| git revert | 撤销提交 |
| git log | 查看日志 |
| git diff | 查看差异 |
Git 工作流
- Git Flow:master、develop、feature、release、hotfix
- GitHub Flow:master + feature branch
- GitLab Flow:环境分支
2. Maven
| 命令 | 作用 |
|---|---|
| mvn clean | 清理 |
| mvn compile | 编译 |
| mvn test | 测试 |
| mvn package | 打包 |
| mvn install | 安装到本地仓库 |
| mvn deploy | 部署到远程仓库 |
生命周期
- clean、default、site
- 依赖范围:compile、test、provided、runtime
依赖冲突解决
- 最短路径优先
- 先声明优先
- exclusion 排除
3. Docker
| 命令 | 作用 |
|---|---|
| docker build | 构建镜像 |
| docker run | 运行容器 |
| docker ps | 查看容器 |
| docker logs | 查看日志 |
| docker exec | 进入容器 |
| docker stop | 停止容器 |
| docker rm | 删除容器 |
| docker rmi | 删除镜像 |
| docker-compose | 编排多容器 |
Dockerfile 常用指令
- FROM、WORKDIR、COPY、ADD
- RUN、CMD、ENTRYPOINT
- EXPOSE、ENV、VOLUME
十六、其他技术
1. Elasticsearch
- 核心概念:Index、Type、Document、Field
- 倒排索引原理
- 分词器:Standard、IK
- 查询 DSL:match、term、bool、range
- 聚合查询:terms、avg、sum
- 与 MySQL 同步
2. Nginx
- 反向代理
- 负载均衡
- 静态资源服务
- 配置文件结构
- 常用配置:upstream、location、proxy_pass
3. 定时任务
| 方案 | 特点 |
|---|---|
| Timer | 简单、单线程 |
| ScheduledExecutor | 多线程 |
| Spring @Scheduled | 注解方式 |
| Quartz | 功能强大 |
| XXL-JOB | 分布式调度 |
| Elastic-Job | 分布式调度 |
4. 日志框架
- 门面:SLF4J、Commons Logging
- 实现:Logback、Log4j2
- 日志级别:TRACE、DEBUG、INFO、WARN、ERROR
- 配置:日志格式、滚动策略、异步日志
5. 单元测试
- JUnit 5:@Test、@BeforeEach、@AfterEach
- Mockito:mock、when、verify
- 断言:assertEquals、assertTrue
6. 安全
| 问题 | 解决方案 |
|---|---|
| SQL 注入 | 预编译语句、参数校验 |
| XSS | 输入过滤、输出编码 |
| CSRF | Token 验证、SameSite Cookie |
| 越权 | 权限校验 |
| 敏感数据 | 加密存储、脱敏展示 |
7. RESTful API 设计
- URI 设计:名词复数、层级结构
- HTTP 方法语义
- 状态码使用
- 版本控制
- 分页、过滤、排序
十七、项目与软技能
1. 项目介绍模板
- 项目背景:解决什么问题
- 技术架构:用了哪些技术
- 核心功能:主要功能模块
- 你的职责:负责哪些模块
- 技术亮点:有什么创新点
- 遇到的问题:如何解决的
2. 项目深挖问题
- 为什么选择这个技术方案?
- 系统 QPS 能达到多少?怎么测的?
- 如何保证系统高可用?
- 做过哪些性能优化?
- 遇到过线上问题吗?怎么排查的?
- 如果重新设计会怎么改进?
3. 软技能
| 方面 | 考察点 |
|---|---|
| 学习能力 | 如何学习新技术、阅读源码吗 |
| 解决问题 | 遇到问题怎么解决 |
| 沟通协作 | 如何与团队协作 |
| 抗压能力 | 如何应对紧急需求 |
| 职业规划 | 短期和长期目标 |
面试准备建议
重点复习优先级(按重要程度排序)
- Java 基础 + 集合 + 并发 + JVM
- MySQL + Redis
- Spring + Spring Boot + MyBatis
- 计算机网络
- 数据结构与算法(每天刷 2-3 题)
- 分布式 + 微服务 + 消息队列
- 项目经验(准备 2-3 个亮点)
学习资源推荐
- 刷题:LeetCode Hot 100、剑指 Offer
- 视频:尚硅谷、黑马程序员
- 博客:JavaGuide、小林 coding