Skip to content

Java 后端

4月份内完成

Java 核心基础

基础语法:面向对象三大特性、异常处理、泛型、反射、注解

集合框架:ArrayList/LinkedList/HashMap/ConcurrentHashMap 底层实现、优缺点、线程安全问题

并发编程:线程创建方式、线程池 7 大参数与工作流程、synchronized 与 ReentrantLock 区别、volatile 关键字作用、ThreadLocal 原理

JVM 基础:内存模型(堆 / 栈 / 方法区)、双亲委派机制、常见 GC 算法(标记清除 / 复制 / 标记整理)、G1/ZGC 基本了解

2026 年重点:JDK17 成为大厂基线,必须了解虚拟线程(JDK21+)的基本概念和优势

Spring Boot 3.x

  • ✅能独立搭建 Spring Boot 项目,完成 CRUD 接口开发
  • 理解 IoC 和 AOP 核心思想
  • ✅掌握 @Controller/@Service/@Repository/@Autowired 等核心注解
  • ✅会使用 application.yml/properties 配置文件
  • 了解自动配置原理和 Bean 生命周期

MySQL 数据库

✅ 熟练编写增删改查、连接查询、子查询

✅ 理解事务 ACID 特性和 4 种隔离级别


事务(Transaction)就是一组数据库操作,要么全部成功,要么全部失败回滚

比如转账:A 账户减 100、B 账户加 100。这两个操作必须放在一个事务里。

如果只执行了“减 100”,还没来得及“加 100”就出错了,就会出现钱丢失,所以必须保证一致性。


事务的四大特性(ACID):

  • 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败

    • 实现方式:数据库一般通过 undo log 来实现回滚。
  • 一致性(Consistency):事务执行前后,数据库都要处于合法状态,满足业务规则和约束

    • ACID 里的“一致性”不是单独某个机制直接保证的,而是由:原子性、隔离性、持久性、数据库约束、应用逻辑共同保证的结果。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

    • 多个事务并发执行时,彼此之间互不干扰,就像每个事务“独占”数据库一样
  • 持久性(Durability):事务一旦提交,结果就必须永久保存

    • 数据库通常通过:redo log、WAL(Write Ahead Logging)来保证崩溃恢复后数据不丢。

为什么需要隔离级别:多个事务同时执行时,可能出现互相干扰的问题。

为了管理这种并发干扰,SQL 标准定义了 4 种隔离级别。隔离级别越高,越“安全”,但并发性能通常越差。隔离级别越低,性能更好,但容易出错。隔离级别越高,能解决的问题越多,但并发越低。


并发时常见的 3 种问题:

  • 脏读(Dirty Read):一个事务读到了另一个事务还没提交的数据
    • 例子:
      • T1 把余额从 100 改成 50,但还没提交
      • T2 读到余额是 50
      • 结果 T1 回滚了,余额还是 100
      • 那 T2 读到的 50 就是“脏数据”
  • 不可重复读(Non-repeatable Read):同一个事务内,两次读取同一条数据,结果不一样。
    • 例子:
      • T1 第一次读到余额是 100
      • T2 修改并提交,把余额改成 50
      • T1 第二次再读,发现变成 50
  • 幻读(Phantom Read):同一个事务内,两次执行相同条件的查询,返回的行数变了,像“凭空多出来或少了几行”。
    • 例子:
      • T1 查询“工资大于 10000 的员工”,查到 3 条
      • T2 插入一条工资 12000 的员工并提交
      • T1 再查一次,变成 4 条

4 种隔离级别,从低到高依次是:

  1. Read Uncommitted
  2. Read Committed
  3. Repeatable Read
  4. Serializable

越往下,隔离越强,问题越少,性能越差。


Read Uncommitted(读未提交):

  • 特点:一个事务可以读到另一个事务未提交的数据。
  • 会出现的问题:脏读、不可重复读、幻读
  • “读未提交”连别人没提交的数据都能看到,所以最不安全。

Read Committed(读已提交):

  • 特点:只能读到已经提交的数据,避免脏读。
  • 会出现的问题:不可重复读、幻读
  • 它保证你读到的每次数据都是别人提交后的“有效数据”,但两次读之间别人仍然可以修改。

Repeatable Read(可重复读):

  • 特点:同一个事务内,多次读取同一条记录,结果保持一致。
  • 会出现的问题:幻读
  • 它保证“同一行数据重复读,结果不变”。

Serializable(可序列化)

  • 特点:最高隔离级别,事务之间几乎按顺序执行。
  • 不会出现问题
  • 它最安全,但并发能力最差,因为很多操作会被阻塞。

隔离级别脏读不可重复读幻读
Read Uncommitted
Read Committed
Repeatable Read
Serializable
  • 读未提交:太危险,基本不用
  • 读已提交:常见,减少脏读
  • 可重复读:兼顾一致性和并发,常用于大多数业务
  • 可序列化:最安全,但性能差,少用

掌握索引原理(B + 树)、索引失效的常见情况

索引的本质是一种用于加速查询的数据结构。

在 MySQL 里底层实现:B+ 树(B+ Tree)

为什么不用数组 / 链表 / 哈希:

  • 数组:有序数组查找快,插入慢(要移动大量数据)
  • 链表:插入快,查询慢
  • 哈希:查询快,不支持范围查询(BETWEEN、>、<),不支持排序(ORDER BY)

为什么选择 B+ 树:同时兼顾查询效率 + 范围查询 + 磁盘 IO 优化

B+ 树结构特点:

  • 所有数据都在叶子节点
  • 非叶子节点只存索引(key)
  • 叶子节点之间有链表连接(非常关键!)

为什么适合数据库:因为数据库数据在磁盘上

  • 减少磁盘 IO:一个节点 = 一页、一个节点可以存很多 key、树的高度很低(通常 2~4 层)
  • 范围查询超强:叶子节点是有序 + 链表连接

MySQL 索引类型:在 InnoDB 中:

  • 聚簇索引(Clustered Index):主键索引
    • 数据和索引在一起
    • 叶子节点存的是整行数据
    • 一张表只能有一个
  • 二级索引(普通索引)
    • 叶子节点存的是:主键值
    • 查数据需要回表

什么是回表:

SELECT name FROM user WHERE age = 20;
  1. 用 age 索引查 → 得到主键 id
  2. 再用 id 查主键索引 → 拿到数据
  • 这一步叫:回表

索引失效的常见情景:

  • 使用函数:WHERE YEAR(create_time) = 2024
  • 字段类型不匹配:WHERE id = '123'
  • 模糊查询:LIKE '%abc'(前缀不确定)
  • OR 连接:WHERE a = 1 OR b = 2

索引的代价:

  • 写性能下降:INSERT / UPDATE / DELETE 要维护索引
  • 占用空间:索引也是数据结构

适合加索引的情况:

  • 经常作为查询条件(WHERE)
  • 数据区分度高(不是全是 0/1)
  • 用于排序(ORDER BY)或分组(GROUP BY)

不适合的:

  • 字段取值很少(性别、状态)
  • 更新非常频繁(写入成本高)

会使用 explain 分析慢查询

了解 MVCC 基本概念

工程工具与协作

  • ✅Git 基本操作:clone/add/commit/push/pull/ 分支管理 / 解决冲突
  • ✅会使用 IDEA/Eclipse 进行开发、调试、断点排查
  • 了解 Maven/Gradle 依赖管理
  • ✅会写简单的单元测试(JUnit)

计算机基础

  • 数据结构:数组、链表、栈、队列、树、哈希表
  • 计算机网络:TCP 三次握手四次挥手、HTTP/HTTPS 区别、RESTful API 设计原则
  • 操作系统:进程与线程区别、内存管理基本概念

算法能力

  • 刷完 LeetCode 热题 100 道,重点掌握:
    • 链表操作(反转、合并、环形链表)
    • 数组与字符串(两数之和、最长无重复子串)
    • 栈与队列(有效括号)
    • 二叉树遍历
    • 简单动态规划

持久层框架

  • MyBatis/MyBatis-Plus:熟练使用注解和 XML 方式编写 SQL,掌握分页插件、条件构造器
  • 了解 JPA/Hibernate 的基本使用

Redis 缓存

  • 掌握 5 种基本数据类型(String/List/Set/Hash/ZSet)及常用命令
  • 理解缓存穿透 / 击穿 / 雪崩问题及解决方案
  • 了解 Redis 持久化(RDB/AOF)和分布式锁的基本实现

Linux 基本操作

  • 常用命令:ls/cd/pwd/rm/mkdir/vi/cat/grep/ps/kill
  • ✅会在 Linux 上部署简单的 Java 项目
  • 会查看日志文件排查问题

完整项目经验

  • 至少有 1 个能跑起来的 Spring Boot 项目(如校园二手交易平台、博客系统、图书管理系统)
  • 项目中必须包含:用户登录注册、权限控制、分页查询、文件上传等常见功能
  • 能清晰讲解:业务场景、自己负责的模块、遇到的问题及解决方案、性能优化点

2026 年建议:在项目中加入 Redis 缓存热点数据、统一异常处理、接口文档(Swagger/OpenAPI)等亮点

微服务基础

  • 了解 Spring Cloud Alibaba 核心组件:Nacos(服务注册发现)、Sentinel(熔断限流)
  • 理解微服务架构的基本思想和优缺点

消息队列

  • 了解 RocketMQ/Kafka 的基本概念和使用场景
  • 知道消息丢失、重复消费、消息堆积的解决方案

云原生入门

  • Docker 基本操作:镜像构建、容器运行、Dockerfile 编写
  • 了解 Kubernetes 的基本概念

AI 工程化基础

  • Spring AI:能使用 Spring AI 对接大模型 API,实现简单的 AI 功能
  • 了解向量数据库和 RAG 的基本概念

其他

  • 了解 Elasticsearch 全文检索
  • 会使用 Postman/Apifox 进行接口测试
  • 有开源项目贡献或技术博客

基础深度比广度更重要:面试官更看重你对 HashMap、线程池、MySQL 索引等核心知识点的理解深度,而不是你会多少技术

项目经验是核心:一个有亮点的项目胜过十门课程成绩,不要只写 "熟悉 Spring Boot",要写 "基于 Spring Boot+MyBatis-Plus 开发了 XX 系统,通过 Redis 缓存热点商品,QPS 提升 3 倍"

AI 工具使用能力:会使用 AI 辅助开发(如代码生成、问题排查)是加分项,但不能依赖 AI,必须理解代码背后的原理

日常实习要求低于暑期实习:日常实习更看重学习能力和上手速度,只要基础扎实,有一个完整的项目,就有很大机会

记录学习,分享技术