
1. Java面试核心知识体系全景图Java作为企业级应用开发的主流语言其面试考察的知识点呈现明显的体系化特征。根据近三年一线大厂面试真题统计完整的Java面试知识体系可分为六大核心模块Java基础占比25%包含语言特性、集合框架、IO/NIO、并发编程等JVM原理占比15%内存模型、垃圾回收、类加载机制等数据库占比20%MySQL优化、事务隔离、Redis高级特性等框架生态占比15%Spring设计思想、MyBatis原理等分布式架构占比15%微服务、消息队列、分布式事务等系统设计占比10%高并发、高可用设计方案等这个比例分布反映了当前企业对Java开发者能力要求的三个关键趋势基础知识的深度理解比框架使用更重要分布式系统设计能力成为中级以上岗位的硬性要求JVM调优经验是区分普通开发与高级开发的重要分水岭2. Java基础高频考点精析2.1 集合框架的底层实现原理ArrayList vs LinkedList的存储差异ArrayList底层采用Object[]数组默认初始容量10扩容时按1.5倍增长JDK8通过Arrays.copyOf实现LinkedList使用双向链表结构每个Node节点包含item、prev、next三个字段// ArrayList扩容核心代码JDK17 private Object[] grow(int minCapacity) { int oldCapacity elementData.length; if (oldCapacity 0 || elementData ! DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { int newCapacity ArraysSupport.newLength(oldCapacity, minCapacity - oldCapacity, /* minimum growth */ oldCapacity 1 /* preferred growth */); return elementData Arrays.copyOf(elementData, newCapacity); } return elementData new Object[Math.max(DEFAULT_CAPACITY, minCapacity)]; }HashMap的哈希碰撞解决方案JDK8之前数组链表JDK8之后数组链表/红黑树链表长度≥8且数组长度≥64时转换关键参数负载因子(默认0.75)、初始容量(默认16)、树化阈值实际面试中90%的面试官会追问为什么HashMap线程不安全如何解决此时需要结合modCount字段和并发修改异常展开说明。2.2 并发编程的三大核心问题可见性问题JMM内存模型中的工作内存与主内存同步延迟解决方案volatile关键字、synchronized锁、final不可变性原子性问题i非原子操作的实际执行步骤解决方案Atomic原子类、CAS乐观锁、synchronized同步有序性问题指令重排序导致的执行顺序异常解决方案happens-before原则、内存屏障线程池的七大核心参数public ThreadPoolExecutor( int corePoolSize, // 常驻核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 空闲线程存活时间 TimeUnit unit, // 时间单位 BlockingQueueRunnable workQueue, // 工作队列 ThreadFactory threadFactory, // 线程工厂 RejectedExecutionHandler handler // 拒绝策略 )常见坑点使用Executors快捷创建线程池可能导致OOMFixedThreadPool使用无界队列CachedThreadPool最大线程数为Integer.MAX_VALUE3. JVM深度解析与性能调优3.1 内存区域的划分与溢出场景运行时数据区线程私有程序计数器、Java虚拟机栈、本地方法栈线程共享堆、方法区元空间、直接内存典型内存溢出案例栈溢出-Xss设置太小或递归调用过深// 模拟栈溢出 public class StackOverflow { static void recursive() { recursive(); // 无限递归 } public static void main(String[] args) { recursive(); } }堆溢出大对象分配或内存泄漏元空间溢出动态生成大量类如CGLib代理3.2 GC算法与调优实战垃圾收集器组合方案新生代ParNew多线程标记-复制老年代CMS并发标记清除或G1分区域收集关键JVM参数示例# 生产环境推荐配置JDK8 -Xms4g -Xmx4g # 堆内存初始最大避免动态扩容 -XX:MetaspaceSize256m # 元空间初始大小 -XX:UseG1GC # 使用G1收集器 -XX:MaxGCPauseMillis200 # 目标暂停时间调优工具链监控jstat、VisualVM分析MAT内存分析工具诊断Arthas在线诊断工具4. 数据库与缓存的高阶考点4.1 MySQL索引优化原则B树索引的检索过程从根节点开始二分查找沿非叶子节点层向下定位在叶子节点链表遍历范围查询优势索引失效的六大场景违反最左前缀原则对索引列做运算或函数处理使用!或操作符类型隐式转换LIKE以通配符开头OR条件未全部索引真实案例某电商平台用户查询接口在WHERE status1 AND create_time2023-01-01条件下即使create_time有索引由于status过滤性差90%数据status1实际应该建立(create_time, status)的联合索引。4.2 Redis持久化策略对比RDB与AOF混合模式RDB快照二进制压缩存储恢复快但可能丢失数据AOF日志记录每条写命令数据安全但文件大混合模式Redis4.0RDB全量AOF增量缓存穿透解决方案对比表方案实现方式优点缺点布隆过滤器位数组哈希函数内存占用极小存在误判可能空值缓存缓存null或特殊标记实现简单可能缓存大量无效key互斥锁SETNX实现分布式锁保证数据一致性降低系统吞吐量5. 框架原理与分布式架构5.1 Spring循环依赖解决机制三级缓存的工作流程一级缓存singletonObjects存放完整Bean二级缓存earlySingletonObjects存放早期引用三级缓存singletonFactories存放ObjectFactory// Spring解决循环依赖的核心代码 protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject this.singletonObjects.get(beanName); if (singletonObject null isSingletonCurrentlyInCreation(beanName)) { singletonObject this.earlySingletonObjects.get(beanName); if (singletonObject null allowEarlyReference) { synchronized (this.singletonObjects) { // 从三级缓存获取工厂对象 ObjectFactory? singletonFactory this.singletonFactories.get(beanName); if (singletonFactory ! null) { singletonObject singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return singletonObject; }5.2 分布式事务的实践方案Seata的AT模式执行流程一阶段解析SQL生成前后镜像执行业务SQL提交前镜像到UNDO_LOG二阶段提交删除UNDO_LOG二阶段回滚根据UNDO_LOG生成反向SQL校验脏写比对后镜像与当前数据性能优化建议对非核心业务使用SAGA模式全局锁等待超时时间设置为3秒避免大事务拆分多个小事务6. 系统设计方法论6.1 高并发秒杀系统设计四层架构设计接入层Nginx负载均衡限流应用层Redis预减库存本地缓存服务层MQ削峰填谷分布式锁数据层MySQL库存扣减分库分表库存扣减的原子性保证UPDATE item SET stock stock - 1 WHERE item_id 1001 AND stock 1实际项目中遇到的坑点Redis库存与数据库最终一致性需要定时对账热点key导致Redis节点负载不均通过key哈希打散解决超卖问题需配合分布式锁版本号机制6.2 设计模式的实际应用策略模式在支付系统中的应用// 支付策略接口 public interface PaymentStrategy { boolean pay(BigDecimal amount); } // 具体策略实现 Component public class AlipayStrategy implements PaymentStrategy { Override public boolean pay(BigDecimal amount) { // 调用支付宝SDK } } // 策略上下文 Service public class PaymentContext { private final MapString, PaymentStrategy strategyMap; public PaymentContext(ListPaymentStrategy strategies) { this.strategyMap strategies.stream() .collect(Collectors.toMap( s - s.getClass().getSimpleName().replace(Strategy, ).toLowerCase(), Function.identity() )); } public boolean executePayment(String type, BigDecimal amount) { PaymentStrategy strategy strategyMap.get(type.toLowerCase()); if (strategy null) { throw new IllegalArgumentException(Unsupported payment type); } return strategy.pay(amount); } }在电商系统中这种设计可以灵活支持新增支付方式而不影响现有代码符合开闭原则。