Java 大厂面试 200 题完整版含答案解析

发布时间:2026/5/17 8:57:42

Java 大厂面试 200 题完整版含答案解析 前言本文整理了近两年从阿里、腾讯、字节、美团、京东、拼多多等大厂面试中高频出现的 200 道 Java 面试题覆盖Java 基础、集合、并发、JVM、Spring、MySQL、Redis、消息队列、分布式、场景设计等核心模块每题都附有简明扼要的答案解析助你高效备战。一、Java 基础30题1. JDK、JRE、JVM 的区别JVMJava 虚拟机负责执行字节码JREJVM 核心类库运行 Java 程序的环境JDKJRE 开发工具javac、javadoc等开发必备2. 和 equals 的区别基本类型比较值引用类型比较地址equalsObject 默认是String/Integer 等重写后比较内容3. String、StringBuilder、StringBuffer 区别类可变性线程安全性能String不可变安全低StringBuilder可变不安全高StringBuffer可变安全(synchronized)中4. String 为什么是不可变的char[]/byte[]用final修饰类用final修饰不能被继承好处线程安全、可用作 HashMap 的 key、字符串常量池优化5. final、finally、finalize 的区别final修饰类/方法/变量表示不可变finallytry-catch 中必执行的代码块finalizeObject 方法GC 前调用已废弃6. 接口和抽象类的区别接口多实现、只能定义常量、JDK8支持默认方法抽象类单继承、可有状态和构造器设计层面接口是 能做什么抽象类是 是什么7. 重载和重写的区别重载Overload同类中方法名相同参数列表不同重写Override子类重写父类方法方法签名相同8. Java 的基本数据类型有哪些8种byte(1B)、short(2B)、int(4B)、long(8B)、float(4B)、double(8B)、char(2B)、boolean(1B)9. 自动装箱和拆箱的原理装箱Integer.valueOf(int)拆箱Integer.intValue()注意Integer 缓存了 -128~12710. 什么是泛型类型擦除泛型在编译期检查运行期通过类型擦除转换为 Object避免 ClassCastException。11. 反射的原理及应用通过 Class 对象在运行时获取类信息并操作。应用Spring IOC、动态代理、ORM框架等。12. 动态代理有几种实现JDK 动态代理基于接口Proxy.newProxyInstance()CGLIB基于继承通过 ASM 生成子类13. 异常体系结构Throwable→Error不可恢复/ExceptionException→RuntimeException非受检/ 其他受检14. try-catch-finally 中 finally 一定会执行吗不一定。System.exit()、JVM 崩溃、守护线程结束时不会执行。15. Java IO 流分类按方向输入流/输出流按单位字节流/字符流按功能节点流/处理流16. BIO、NIO、AIO 区别BIO同步阻塞一连接一线程NIO同步非阻塞多路复用SelectorAIO异步非阻塞回调机制17. NIO 的三大核心组件Channel双向通道Buffer数据缓冲区Selector多路复用选择器18. 深拷贝和浅拷贝的区别浅拷贝只复制引用对象共享深拷贝递归复制所有对象19. Object 类有哪些方法equals、hashCode、toString、clone、getClass、wait、notify、notifyAll、finalize20. hashCode 和 equals 的关系equals 相等hashCode 必须相等hashCode 相等equals 不一定相等重写 equals 必须重写 hashCode21. Java 8 有哪些新特性Lambda 表达式、Stream API、Optional、新日期 API、接口默认方法、CompletableFuture22. Lambda 表达式原理编译为invokedynamic指令运行时生成函数式接口实现类。23. Stream 中间操作和终结操作中间操作filter、map、sorted惰性终结操作collect、forEach、reduce24. Optional 的作用优雅处理 null避免 NPE。常用of、ofNullable、isPresent、orElse、map25. Java 集合体系Collection → List、Set、QueueMap → HashMap、TreeMap、LinkedHashMap26. ArrayList 和 LinkedList 区别ArrayList数组实现查询O(1)插入删除O(n)LinkedList双向链表查询O(n)插入删除O(1)27. HashMap 底层结构JDK1.7数组 链表JDK1.8数组 链表/红黑树链表长度8且数组64转红黑树28. HashMap 的扩容机制默认容量 16负载因子 0.75当 size capacity * loadFactor 时扩容为 2 倍重新计算每个元素的位置29. HashMap 为什么容量是 2 的幂用(n-1) hash替代取模提升性能保证哈希均匀分布30. HashMap 为什么线程不安全JDK1.7 头插法扩容可能成环JDK1.8 put 时可能丢失数据推荐使用 ConcurrentHashMap二、Java 并发40题31. 线程和进程的区别进程是资源分配的最小单位线程是 CPU 调度的最小单位。同一进程的线程共享内存空间。32. 创建线程的方式继承 Thread 类实现 Runnable 接口实现 Callable FutureTask线程池推荐33. 线程的生命周期NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATED34. sleep 和 wait 的区别sleepThread 静态方法不释放锁waitObject 方法释放锁需在 synchronized 块中使用35. start 和 run 的区别start启动新线程调用 runrun普通方法调用在当前线程执行36. 如何停止一个线程interrupt() 检查中断标志共享 volatile 变量不要用已废弃的stop()37. synchronized 的原理基于对象监视器Monitor通过 monitorenter 和 monitorexit 指令实现。38. synchronized 的锁升级过程无锁 → 偏向锁 → 轻量级锁 → 重量级锁不可逆。39. synchronized 和 ReentrantLock 的区别特性synchronizedReentrantLock实现JVM层API层可中断否是公平锁否可选条件变量单一多个Condition40. volatile 的作用保证可见性禁止指令重排不保证原子性41. volatile 的实现原理通过内存屏障实现写时刷新主内存读时从主内存加载。42. CAS 是什么Compare And Swap比较并交换原子操作基于 CPU 的 cmpxchg 指令。43. CAS 的问题ABA 问题用 AtomicStampedReference 解决自旋开销大只能保证一个变量原子性44. AQS 是什么AbstractQueuedSynchronizer并发包基础框架基于 CLH 队列 state 变量实现。45. AQS 的核心实现state共享状态CLH 队列等待线程的双向链表模板方法tryAcquire、tryRelease46. ReentrantLock 的实现原理基于 AQSstate 表示锁的重入次数公平锁和非公平锁的区别在于是否检查队列。47. 公平锁和非公平锁公平锁按队列顺序获取非公平锁直接竞争性能更高默认48. 读写锁 ReentrantReadWriteLock读读不互斥读写互斥写写互斥。state 高16位记录读锁低16位记录写锁。49. ThreadLocal 的原理每个 Thread 内部有 ThreadLocalMapkey 为 ThreadLocal 实例弱引用value 为存储值。50. ThreadLocal 的内存泄漏key 是弱引用会被回收但 value 是强引用需手动调用remove()。51. 线程池的核心参数corePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime空闲线程存活时间workQueue任务队列threadFactory线程工厂handler拒绝策略52. 线程池的执行流程核心线程 → 队列 → 非核心线程 → 拒绝策略53. 线程池的拒绝策略AbortPolicy抛异常默认CallerRunsPolicy调用者执行DiscardPolicy丢弃DiscardOldestPolicy丢弃最旧任务54. 为什么不推荐用 Executors 创建线程池newFixedThreadPool/newSingleThreadExecutor无界队列导致 OOMnewCachedThreadPool线程数无上限导致 OOM55. 线程池大小如何设置CPU密集型N1IO密集型2N 或 N * (1 等待时间/计算时间)56. ConcurrentHashMap 的实现JDK1.7分段锁 SegmentJDK1.8CAS synchronized 锁单个 Node57. ConcurrentHashMap 的 size 怎么计算baseCount CounterCell 数组求和类似 LongAdder 思想。58. CountDownLatch 和 CyclicBarrier 区别CountDownLatch一次性等待 N 个线程完成CyclicBarrier可重复N 个线程相互等待59. Semaphore 的作用信号量控制同时访问资源的线程数常用于限流。60. Future 和 CompletableFuture 区别CompletableFuture 支持链式调用、组合、异步回调功能更强大。61. 死锁的四个必要条件互斥、占有且等待、不可剥夺、循环等待62. 如何避免死锁按顺序加锁设置超时时间死锁检测63. 乐观锁和悲观锁乐观锁CAS、版本号悲观锁synchronized、Lock64. 公平锁实现思路判断队列中是否有等待线程有则排队无则尝试获取。65. 锁消除和锁粗化锁消除JIT 检测到无需加锁的代码自动消除锁粗化将多次加锁合并为一次66. happens-before 原则JMM 中定义的偏序关系前一个操作的结果对后一个操作可见。67. 内存屏障的种类LoadLoad、StoreStore、LoadStore、StoreLoad68. ForkJoinPool 的特点工作窃取算法work-stealing适合分治任务。69. 异步编程的方式Future、CompletableFuture、Reactor 响应式编程、Kotlin 协程70. 如何排查线程问题jstack 查看线程栈Arthas thread 命令定位 BLOCKED/WAITING 线程三、JVM30题71. JVM 内存结构堆Heap对象实例栈Stack局部变量、方法调用方法区类信息、常量池程序计数器当前线程执行位置本地方法栈native 方法72. 堆的分代新生代Eden Survivor0 Survivor18:1:1老年代元空间JDK8 取代永久代73. 对象的创建过程类加载检查 → 分配内存 → 初始化零值 → 设置对象头 → 执行构造方法74. 对象的内存布局对象头Mark Word 类型指针 实例数据 对齐填充75. 如何判断对象是否可回收引用计数法有循环引用问题可达性分析GC Roots76. GC Roots 有哪些虚拟机栈中引用的对象方法区中静态变量方法区中常量本地方法栈中引用的对象77. 引用的类型强引用永不回收软引用内存不足时回收弱引用下次 GC 时回收虚引用随时回收用于跟踪 GC78. 垃圾回收算法标记-清除会产生碎片复制算法新生代用标记-整理老年代用分代收集79. 常见的垃圾收集器Serial、Parallel、ParNewCMS已废弃G1、ZGC、Shenandoah80. CMS 收集器的过程初始标记 → 并发标记 → 重新标记 → 并发清除81. G1 收集器的特点Region 分区可预测停顿时间整体看是标记-整理局部是复制算法82. ZGC 的特点停顿时间 10ms染色指针 读屏障支持 TB 级堆83. 什么时候触发 Minor GCEden 区满时。84. 什么时候触发 Full GC老年代空间不足方法区空间不足System.gc() 调用Minor GC 后晋升对象老年代放不下85. 对象什么时候进入老年代年龄达到阈值默认15大对象直接进入Survivor 区相同年龄对象超过一半动态年龄判定86. 类加载过程加载 → 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载87. 双亲委派机制类加载请求先委托给父加载器父加载器无法加载时才自己加载。88. 双亲委派的好处避免类重复加载保证核心类库安全89. 如何打破双亲委派重写 loadClass 方法如 Tomcat、JDBC SPI线程上下文类加载器。90. 类加载器有哪些BootstrapClassLoader启动类加载器ExtensionClassLoader扩展类加载器AppClassLoader应用类加载器自定义类加载器91. 常用的 JVM 参数-Xms、-Xmx堆初始/最大-Xmn新生代大小-XX:MetaspaceSize元空间-XX:UseG1GC使用 G192. 如何排查 OOM堆 dumpjmap -dumpMAT 分析查看 GC 日志93. 如何排查 CPU 飙高top查看进程top -Hp pid查看线程jstack查看线程栈定位代码94. JIT 编译热点代码编译为本地机器码包括 C1客户端和 C2服务端编译器。95. 逃逸分析分析对象是否逃出方法/线程未逃逸可栈上分配、标量替换、锁消除。96. 常见的 JVM 调优工具jps、jstat、jmap、jstack、jconsole、VisualVM、Arthas、MAT97. Stop The WorldGC 时暂停所有用户线程所有 GC 都有 STW只是时间不同。98. 三色标记算法白色未标记、灰色已标记未扫描完、黑色已扫描完并发标记基础。99. 写屏障GC 并发标记时记录引用变化防止漏标。100. JDK 17 的 GC 推荐中小堆用 G1低延迟场景用 ZGC。四、Spring25题101. Spring 的核心特性IOC、AOP、声明式事务、MVC102. IOC 的原理控制反转对象的创建和依赖关系由容器管理通过 DI 注入。103. AOP 的原理面向切面编程通过动态代理实现横切逻辑日志、事务、权限等。104. Spring Bean 的作用域singleton默认、prototype、request、session、application105. Spring Bean 的生命周期实例化 → 属性赋值 → BeanNameAware/BeanFactoryAware → BeanPostProcessor前置 → 初始化InitializingBean、init-method → BeanPostProcessor后置 → 使用 → 销毁106. 循环依赖如何解决三级缓存一级完成的单例二级早期单例三级单例工厂解决AOP代理107. Autowired 和 Resource 的区别AutowiredSpring提供按类型注入ResourceJDK提供按名称注入108. BeanFactory 和 ApplicationContext 的区别BeanFactory懒加载基础容器ApplicationContext预加载扩展功能国际化、事件等109. Spring 事务的传播行为REQUIRED默认、REQUIRES_NEW、SUPPORTS、NOT_SUPPORTED、MANDATORY、NEVER、NESTED110. Spring 事务失效的场景方法非 public自调用this调用异常被吞掉异常类型不匹配默认只回滚 RuntimeException数据库不支持事务111. Spring 中用到了哪些设计模式工厂、单例、代理、模板方法、观察者、责任链、装饰器、策略112. Spring MVC 的执行流程DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ViewResolver → View113. SpringBoot 自动配置原理EnableAutoConfiguration→AutoConfigurationImportSelector→ 加载spring.factories(2.7前) /AutoConfiguration.imports(3.0)114. SpringBoot 的启动流程SpringApplication.run()→ 准备环境 → 创建容器 → 刷新容器 → 启动完成115. SpringBootApplication 包含哪些注解SpringBootConfigurationEnableAutoConfigurationComponentScan116. Spring Cloud 核心组件注册中心Eureka/Nacos配置中心Config/Nacos网关Gateway负载均衡Ribbon/LoadBalancer熔断Hystrix/Sentinel链路追踪Sleuth117. Nacos 和 Eureka 的区别Nacos支持 AP/CP 切换集成配置中心Eureka纯 AP已停止更新118. Sentinel 的特点流量控制、熔断降级、系统保护、热点参数限流可视化控制台。119. Feign 的原理通过动态代理生成接口实现封装 HTTP 调用。120. SpringBoot Starter 的原理基于 SPI 机制把通用配置打包引入即用。121. 条件注解有哪些ConditionalOnClass、ConditionalOnBean、ConditionalOnProperty、ConditionalOnMissingBean122. Spring 中 BeanPostProcessor 的作用Bean 初始化前后插入自定义逻辑AOP、Autowired 都依赖它。123. FactoryBean 和 BeanFactory 的区别BeanFactoryIOC 容器FactoryBean生产复杂 Bean 的工厂接口124. Spring 中如何保证单例线程安全设计为无状态用 ThreadLocal加锁使用 prototype 作用域125. SpringBoot 如何热部署引入spring-boot-devtools配合 IDE 自动编译。五、MySQL30题126. MySQL 的存储引擎InnoDB默认支持事务、MyISAM不支持事务、Memory127. InnoDB 和 MyISAM 的区别特性InnoDBMyISAM事务支持不支持外键支持不支持锁行锁表锁索引聚簇非聚簇128. 索引的数据结构为什么用 B 树矮胖结构IO少叶子节点存数据非叶子节点存索引叶子节点链表范围查询快129. 聚簇索引和非聚簇索引聚簇索引叶子节点存整行数据InnoDB主键非聚簇索引叶子节点存主键需回表130. 什么是回表通过二级索引查到主键再用主键查整行数据。131. 什么是覆盖索引查询字段都在索引中无需回表。132. 索引最左前缀原则联合索引 (a,b,c)只有按 a、ab、abc 顺序查询才能用上。133. 索引失效的场景不满足最左前缀like %xx索引列计算/函数类型转换or连接非索引列!、not in134. 什么时候不适合建索引数据量小频繁更新区分度低性别很少查询的字段135. 事务的 ACID原子性Atomicityundo log一致性Consistency业务保证隔离性IsolationMVCC 锁持久性Durabilityredo log136. 事务的隔离级别读未提交脏读读已提交不可重复读可重复读默认幻读串行化137. MVCC 的原理多版本并发控制通过 undo log 链 ReadView 实现一致性读。138. 当前读和快照读当前读select for update、insert/update/delete快照读普通 select基于 MVCC139. InnoDB 如何解决幻读快照读MVCC当前读Next-Key Lock间隙锁 行锁140. redo log 和 undo logredo log物理日志崩溃恢复undo log逻辑日志回滚 MVCC141. binlog 和 redo log 区别binlogServer 层归档日志所有引擎都有redo logInnoDB 特有崩溃恢复142. 两阶段提交写 redo logprepare → 写 binlog → 提交 redo logcommit保证一致性。143. MySQL 的锁有哪些全局锁、表锁、行锁共享锁S、排他锁X意向锁、记录锁、间隙锁、Next-Key Lock144. 怎么排查慢 SQL慢查询日志explain分析执行计划show profile索引优化145. explain 关键字段type访问类型system const eq_ref ref range index allkey实际使用的索引rows扫描行数Extra附加信息Using index、Using filesort146. 大表分页优化用where id xxx limit 10替代limit 10000, 10子查询 索引延迟关联147. SQL 优化思路加合适的索引避免 select *小表驱动大表用 limit 限制结果避免索引失效148. 主从复制原理主库写 binlog从库 IO 线程拉取 binlog 写入 relay log从库 SQL 线程回放 relay log149. 主从延迟怎么办强制读主库半同步复制并行复制业务容忍150. 分库分表的策略垂直分库/分表按业务/字段水平分库/分表按 ID 取模、范围、一致性哈希151. 分库分表的问题分布式 ID跨库 join跨库事务分页排序152. 分布式 ID 方案UUID、雪花算法Snowflake、号段模式Leaf、Redis incr153. 数据库连接池怎么选HikariCP推荐性能最高、Druid监控好、DBCP、C3P0154. 死锁如何排查show engine innodb status查看 LATEST DETECTED DEADLOCK优化 SQL 和加锁顺序155. 一条 SQL 的执行过程连接器 → 查询缓存8.0废弃 → 分析器 → 优化器 → 执行器 → 存储引擎六、Redis25题156. Redis 为什么快纯内存单线程避免上下文切换IO 多路复用高效数据结构157. Redis 的数据结构String、List、Hash、Set、ZSet、Bitmap、HyperLogLog、Geo、Stream158. ZSet 的底层实现ziplist小数据量 skiplist hashtable大数据量7.0后用 listpack。159. 跳表的原理多级有序链表平均 O(logN) 查找比红黑树实现简单且支持范围查询。160. Redis 的持久化方式RDB快照二进制AOF命令追加日志混合持久化推荐161. RDB 和 AOF 的区别特性RDBAOF体积小大恢复快慢数据丢失多少162. Redis 过期策略惰性删除访问时检查定期删除周期性扫描配合使用163. Redis 内存淘汰策略noeviction默认allkeys-lru / volatile-lruallkeys-lfu / volatile-lfuallkeys-random / volatile-randomvolatile-ttl164. 缓存穿透查询不存在的数据。解决布隆过滤器、缓存空值。165. 缓存击穿热点 key 失效。解决互斥锁、永不过期。166. 缓存雪崩大量 key 同时失效。解决随机过期时间、多级缓存、熔断降级。167. 如何保证缓存和数据库一致性Cache Aside推荐先更新DB再删除缓存延迟双删订阅 binlogCanal168. Redis 的事务MULTI、EXEC、DISCARD、WATCH不支持回滚不是真正的事务。169. Redis 的主从复制原理全量同步RDB 缓冲区命令增量同步repl_backlog_buffer170. Redis 哨兵机制监控、自动故障转移、配置中心至少3个哨兵防止误判。171. Redis Cluster 集群原理16384 个槽位一致性哈希分布节点互相通信Gossip172. 为什么是 16384 个槽作者解释心跳包大小、节点数限制权衡的结果。173. Redis 分布式锁实现SET NX EX续期看门狗Redisson释放需校验 value用 Lua174. RedLock 算法向多个 Redis 实例申请锁过半成功即获取提升可靠性。175. Redis 单线程为何引入多线程6.0 引入多线程处理 IO命令执行仍单线程。176. 大 key 的危害阻塞主线程网络拥塞内存不均衡177. 如何处理大 key拆分渐进式删除UNLINK业务避免178. Pipeline 的作用批量发送命令减少网络往返。179. Lua 脚本的作用原子执行多个命令避免竞态。180. 缓存预热系统上线前把热点数据加载到缓存避免冷启动击穿数据库。七、消息队列与分布式20题181. 消息队列的作用异步、解耦、削峰182. Kafka、RocketMQ、RabbitMQ 对比特性KafkaRocketMQRabbitMQ吞吐量极高高中延迟msmsμs顺序消息分区有序支持支持事务支持支持支持183. Kafka 高吞吐的原因顺序写盘零拷贝批量发送分区并行184. 如何保证消息不丢失生产者ack、重试Broker刷盘、副本消费者手动 ack185. 如何保证消息不重复幂等性唯一ID 去重表/Redis 去重186. 如何保证消息顺序单分区同一业务key路由到同一队列187. 消息堆积怎么办增加消费者临时扩容分区紧急转储后慢慢消费188. CAP 理论一致性、可用性、分区容错性只能三选二一般保 PCP 或 AP 二选一。189. BASE 理论基本可用、软状态、最终一致性BASE 是对 CAP 中 AP 的扩展。190. 分布式事务方案2PC、3PCTCC本地消息表可靠消息最终一致性SeataAT/TCC/SAGA191. Seata AT 模式原理一阶段执行SQL 记录 undo log二阶段提交删 undo log/ 回滚用 undo log 恢复192. 分布式锁的实现基于数据库select for update基于 RedisSET NX基于 ZooKeeper临时顺序节点193. ZooKeeper 的应用注册中心、配置中心、分布式锁、分布式协调、Leader 选举194. ZAB 协议ZooKeeper 原子广播协议崩溃恢复 消息广播。195. Paxos 和 Raft 的区别Paxos 难懂Raft 易懂本质都是共识算法。196. 分布式 ID 怎么生成雪花算法Leaf号段雪花UidGenerator数据库自增197. 限流算法计数器滑动窗口漏桶令牌桶198. Sentinel 与 Hystrix 的区别Sentinel基于滑动窗口规则动态Hystrix基于线程池/信号量已停止更新199. 怎么设计一个秒杀系统静态化 CDN限流前端 网关 应用层Redis 预扣库存MQ 异步下单防刷验证码、限频200. 怎么设计一个短链系统发号器雪花 62 进制数据库存映射缓存热点链接防爬虫和短链劫持结语200 道题只是大厂面试的冰山一角真正的核心是理解原理、积累实战经验。建议先理解再背诵每个知识点搞清楚为什么这么设计多结合实战用过的项目能说出技术选型和踩坑经历关注源码HashMap、AQS、Spring IOC 等核心源码值得细读构建知识体系把零散知识点串成体系举一反三愿大家都能拿到心仪的 offer如果觉得有帮助欢迎点赞、收藏、关注后续会持续更新更多大厂面经和源码解析。

相关新闻