一、Java基础核心 (重中之重)
- JVM内存模型 (运行时数据区)
- 程序计数器: 当前线程执行的字节码行号指示器。
- Java虚拟机栈: 存储栈帧(局部变量表、操作数栈、动态链接、方法出口)。
StackOverflowError
/OutOfMemoryError
。 - 本地方法栈: 为Native方法服务。
- 堆: 对象实例分配区域,GC主要管理区域。
OutOfMemoryError
。分代模型(Eden, S0, S1, Old)。 - 方法区 (元空间): 存储类信息、常量、静态变量、JIT编译后代码。
OutOfMemoryError
。
- 垃圾回收机制 (GC)
- 对象存活判定:引用计数法(缺陷)、可达性分析(GC Roots)。
- 引用类型:强引用、软引用 (
SoftReference
)、弱引用 (WeakReference
)、虚引用 (PhantomReference
)。 - 经典GC算法:标记-清除、复制、标记-整理。分代收集策略。
- 常见垃圾收集器:Serial, Parallel Scavenge/Parallel Old, ParNew, CMS, G1, ZGC, Shenandoah。重点掌握CMS和G1的工作原理、优缺点及适用场景。
- 类加载机制
- 过程:加载 -> 链接(验证、准备、解析) -> 初始化 -> 使用 -> 卸载。
- 类加载器:Bootstrap, Extension, Application, 自定义。双亲委派模型(原理、作用、如何打破)。
- 常见场景:
ClassNotFoundException
vsNoClassDefFoundError
。
- 多线程与并发
- 线程状态与生命周期: NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。
- 线程创建方式:
Thread
,Runnable
,Callable
/Future
。 - 线程同步:
- 核心问题:原子性、可见性、有序性。
synchronized
:原理(对象监视器monitor,JVM层实现)、锁升级(无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁)。volatile
:保证可见性和禁止指令重排序(内存屏障),不保证原子性。java.util.concurrent.locks
包:ReentrantLock
(可重入、公平/非公平、Condition
)、ReadWriteLock
。
- 线程协作:
wait()
/notify()
/notifyAll()
(必须在synchronized
块内使用)、Condition
的await()
/signal()
。 - 线程池 (
ThreadPoolExecutor
):- 核心参数:核心线程数、最大线程数、工作队列、线程工厂、拒绝策略。
- 工作原理(任务提交流程)。
- 常用线程池 (
Executors.newXXX
的潜在问题及推荐手动创建)。 - 调优与监控。
- 并发工具类 (
java.util.concurrent
):CountDownLatch
:倒计数器,主线程等待。CyclicBarrier
:循环栅栏,线程相互等待。Semaphore
:信号量,控制并发访问数。Exchanger
:线程间交换数据。Atomic
包:原子类(CAS原理、ABA问题、AtomicStampedReference
)。
- 集合框架
- Collection:
List
(ArrayList
扩容机制、LinkedList
、Vector
/Stack
),Set
(HashSet
、LinkedHashSet
、TreeSet
),Queue
/Deque
(ArrayDeque
,PriorityQueue
)。 - Map:
HashMap
(JDK 1.7 vs 1.8+ 数据结构:数组+链表 -> 数组+链表/红黑树、扩容机制、扰动函数、ConcurrentHashMap
(JDK 1.7 分段锁 vs JDK 1.8+ CAS+synchronized),Hashtable
,LinkedHashMap
,TreeMap
。 - Fail-Fast vs Fail-Safe 迭代器。
Comparable
vsComparator
。
- Collection:
二、Java高级特性
- Java 8+ 新特性 (必考)
- Lambda表达式: 语法、函数式接口 (
@FunctionalInterface
)、方法引用。 - Stream API: 创建、中间操作 (
filter
,map
,flatMap
,sorted
,distinct
,limit
,peek
)、终止操作 (forEach
,collect
,reduce
,count
,anyMatch
/allMatch
/noneMatch
,findFirst
/findAny
)、并行流与线程安全。 - Optional: 优雅处理
null
。 - 接口默认方法与静态方法。
- 新日期时间API (
java.time
):LocalDate
,LocalTime
,LocalDateTime
,Instant
,Duration
,Period
,DateTimeFormatter
。
- Lambda表达式: 语法、函数式接口 (
- 网络编程
- TCP/UDP区别,Socket编程基础。
- NIO (Non-blocking I/O):核心概念 (
Channel
,Buffer
,Selector
),Reactor模式。 - Netty框架基础(高性能原因)。
- 反射 (
java.lang.reflect
)- 获取Class对象、操作Field/Method/Constructor。
- 动态代理:JDK动态代理 (
Proxy
+InvocationHandler
)、CGLIB。 - 应用场景与性能考量。
- 注解 (
Annotation
)- 元注解 (
@Target
,@Retention
,@Documented
,@Inherited
,@Repeatable
)。 - 自定义注解及处理器(编译时APT、运行时反射)。
- 元注解 (
三、数据库与持久层
- MySQL (深度)
- 索引:
- 数据结构:B+树(为什么比B树/Hash好?)。
- 类型:聚簇索引/非聚簇索引、覆盖索引、联合索引(最左前缀原则)。
- 索引失效场景。
- Explain命令解读(
type
,key
,rows
,Extra
等)。
- 事务 (ACID):
- 隔离级别:读未提交、读已提交、可重复读(MySQL默认)、串行化。脏读、不可重复读、幻读。
- 实现原理:MVCC (多版本并发控制,Undo Log, ReadView)、锁(行锁、间隙锁、临键锁、意向锁)。
- 事务传播行为(Spring层面)。
- 锁机制: 乐观锁 (CAS, Version)、悲观锁 (
SELECT ... FOR UPDATE
)。死锁检测与避免。 - SQL优化: 慢查询分析、避免
SELECT *
、避免函数操作列、分页优化、Join优化。 - 分库分表: 垂直拆分、水平拆分(分片键选择)、中间件(ShardingSphere, MyCat)。
- 索引:
- Redis (深度)
- 数据类型与应用场景:
String
(缓存、计数器),Hash
(对象存储),List
(消息队列、栈),Set
(标签、共同关注),Sorted Set
(排行榜),HyperLogLog
(基数统计),Geo
(地理位置),Bitmaps
(位图)。 - 持久化: RDB (快照)、AOF (日志追加)、混合持久化。
- 高可用与集群: 主从复制、哨兵 (Sentinel)、Cluster分片(数据分片、哈希槽)。
- 缓存问题:
- 缓存穿透:查询不存在数据(布隆过滤器、空值缓存)。
- 缓存击穿:热点key过期瞬间大量请求(互斥锁、永不过期+逻辑过期)。
- 缓存雪崩:大量key同时过期(随机过期时间、集群部署、熔断降级)。
- 缓存一致性:双写模式、失效模式、延时双删、监听binlog(Canal)。
- 内存淘汰策略:
LRU
,LFU
等。 - 分布式锁:
SET key value NX PX
+ Lua脚本保证原子性、RedLock算法(争议)。 - 高性能原因: 内存操作、单线程(避免上下文切换)、I/O多路复用(epoll/kqueue)、高效数据结构。
- 数据类型与应用场景:
四、主流框架与中间件
- Spring Framework (核心)
- IoC (控制反转) / DI (依赖注入): 原理、Bean生命周期、作用域 (
singleton
,prototype
等)、配置方式(XML, Annotation, JavaConfig)。 - AOP (面向切面编程): 概念(切面Aspect、连接点JoinPoint、通知Advice、切入点Pointcut)、动态代理实现(JDK vs CGLIB)、应用场景(日志、事务、权限)。
- Spring事务管理: 声明式事务(
@Transactional
)、传播行为、隔离级别、失效场景(自调用、非public方法、异常捕获处理不当)。 - Spring MVC: 请求处理流程(DispatcherServlet -> HandlerMapping -> Controller -> ModelAndView -> ViewResolver -> View)、常用注解 (
@Controller
,@RequestMapping
,@RequestParam
,@PathVariable
,@RequestBody
,@ResponseBody
)。 - Spring Boot: 自动配置原理 (
@SpringBootApplication
,@EnableAutoConfiguration
,spring.factories
)、Starter机制、外部化配置、Actuator监控。 - Spring Cloud (微服务生态):
- 服务注册与发现:Eureka, Nacos, Consul。
- 服务调用与负载均衡:Ribbon, OpenFeign。
- 服务熔断与降级:Hystrix, Sentinel。
- 网关:Zuul, Gateway。
- 配置中心:Config, Nacos Config。
- 服务跟踪:Sleuth + Zipkin。
- 分布式事务:Seata。
- IoC (控制反转) / DI (依赖注入): 原理、Bean生命周期、作用域 (
- ORM框架 (MyBatis / MyBatis-Plus)
#{}
vs${}
区别(SQL注入)。- 一级缓存(SqlSession级别)、二级缓存(Mapper级别)。
- 延迟加载(懒加载)。
- 动态SQL (
<if>
,<choose>
,<foreach>
,<where>
,<set>
)。 - 插件机制(PageHelper分页、性能分析)。
- MyBatis-Plus核心功能(通用Mapper、条件构造器、分页插件、代码生成器)。
- 消息队列 (Kafka / RocketMQ)
- 核心概念: 生产者、消费者、Broker、Topic、Partition、Offset、Consumer Group。
- 消息可靠性保证:
- 生产者:
acks
配置 (0,1,all)、重试机制、幂等性。 - Broker:副本机制(ISR)、持久化。
- 消费者:手动提交Offset、消费幂等性(唯一ID、业务状态判断)。
- 生产者:
- 顺序性保证: 全局有序(单Partition)、分区有序(消息Key路由到同一Partition)。
- 高吞吐/低延迟设计: 顺序读写、零拷贝 (
sendfile
)、PageCache、批量发送/拉取。 - Kafka vs RocketMQ: 架构差异(Kafka依赖ZooKeeper)、延迟消息、事务消息(RocketMQ更成熟)、社区生态。
五、系统设计与架构
- 分布式理论基础
- CAP定理: 一致性 (C)、可用性 (A)、分区容忍性 (P) 只能三选二。分布式系统必须选择P。常见取舍:CP (ZooKeeper, etcd), AP (Cassandra, Eureka)。
- BASE理论: 基本可用 (BA)、软状态 (S)、最终一致性 (E)。对CAP中一致性和可用性权衡的结果。
- 一致性协议: 2PC (两阶段提交)、3PC (三阶段提交)、Paxos、Raft (Etcd, Consul, TiDB)、ZAB (ZooKeeper)。
- 微服务架构
- 核心挑战:服务拆分原则(DDD)、服务治理(注册发现、负载均衡、熔断降级)、配置管理、链路追踪、分布式事务、API网关。
- 服务间通信:RESTful API, RPC (gRPC, Dubbo), 消息队列。
- 容器化与编排:Docker, Kubernetes (Pod, Deployment, Service, Ingress)。
- 高并发系统设计
- 性能优化: 缓存(多级缓存)、异步化(MQ、线程池)、池化技术(连接池、线程池)、分库分表、读写分离、CDN、静态化。
- 高可用: 冗余(集群、多机房部署)、容灾(故障转移、Failover)、限流(令牌桶、漏桶、滑动窗口)、降级、熔断。
- 负载均衡: LVS (四层)、Nginx (七层)、硬件F5、算法(轮询、权重、IP Hash、最少连接)。
- 设计模式 (重点理解应用场景)
- 创建型:单例模式(饿汉、懒汉、DCL、静态内部类、枚举)、工厂模式(简单工厂、工厂方法、抽象工厂)、建造者模式。
- 结构型:适配器模式、装饰器模式、代理模式(静态代理、动态代理)、外观模式、组合模式。
- 行为型:策略模式、模板方法模式、观察者模式、责任链模式、迭代器模式、状态模式。
- Spring框架中的应用: 工厂模式 (BeanFactory), 代理模式 (AOP), 模板方法模式 (JdbcTemplate), 适配器模式 (HandlerAdapter), 观察者模式 (ApplicationEvent)等。
六、项目经验与软实力
- STAR法则: 清晰描述项目背景 (Situation)、任务 (Task)、行动 (Action)、结果 (Result)。突出技术难点、解决方案、个人贡献。
- 技术深度: 对自己项目中使用到的核心技术(如Redis集群、分库分表、MQ)要知其然并知其所以然,能回答“为什么选这个?”、“遇到什么问题?”、“如何解决的?”。
- 系统设计题: 练习设计秒杀系统、短链服务、微信朋友圈、抢红包、分布式ID生成器、限流系统等经典场景。关注功能性需求和非功能性需求(性能、可用性、扩展性、安全性)。
- 沟通与表达: 逻辑清晰、表达流畅、态度积极、主动提问(了解团队/业务)、展现学习热情和解决问题能力。
- 编码能力: 手写代码题(LeetCode Medium难度为主,常见算法如排序、二分查找、链表操作、二叉树遍历、DFS/BFS、动态规划基础)、白板编码规范清晰。
建议:
- 深挖简历: 确保简历上的每个技术点都能经得起深挖。
- 理解优先于背诵: 面试官更看重你是否真正理解原理和设计思想。
- 关注阿里技术栈: 了解阿里开源项目(如Dubbo, RocketMQ, Sentinel, Seata, Arthas, Nacos)和内部技术(如OceanBase, 盘古存储)。
- 模拟面试: 找同学或朋友模拟面试,锻炼表达和临场反应。
- 保持心态: 面试是双向选择,展现真实的自己。
这份指南覆盖了阿里等大厂Java面试的核心领域。请结合自身项目经验,深入理解原理,勤加练习编码和系统设计。祝你求职顺利!