Java面试图解笔记【六】共享管家讲虚拟线程,外卖预制菜解云原生

《Java面试85题图解版(三)》下篇:高阶特性实战篇

📂 Java面试85题图解版 · 全系列7篇

方法论 | 基础核心篇 | 并发+JVM | Spring+数据库 | Redis缓存 | 高阶架构 | 高阶特性 ← 你在看

📌 全系列总目录 | 💡 每道题 = 结构图 → 场景比喻 → 对比表 → 一句话总结


阅读提示:这是“图解+比喻+一句话总结”面试题库的第六篇,也是全系列终篇。覆盖Java高阶特性、系统实战与最佳实践共9道题。从虚拟线程到云原生,从调优案例到设计模式,面试最后一关的硬核题目都在这里。结构图 → 场景比喻 → 关键对比表 → 一句话总结。

📂 本篇题目导航

题号题目比喻关键词
77Java 21虚拟线程共享管家 vs 专属服务员
78Spring WebFlux vs MVC自助点餐机 vs 柜台
79Sealed Class + 模式匹配食堂自动打菜机
80JVM/DB调优实战案例医生看诊
81千万级大表查询优化图书馆大翻新
82消息队列高可靠 + 死信队列邮局退回机制
83云原生与容器化部署外卖预制菜
84单元测试 vs 集成测试 vs E2E造车质检
85设计模式实战——策略模式打车软件选车型

第77题:Java 21 虚拟线程

一图看清

传统平台线程:1任务1线程,阻塞时占着不放,池化复用,昂贵(~1MB栈+系统调用)
虚拟线程:JVM管理轻量级线程,阻塞时自动从载体线程卸载,无需池化,廉价
  相同Thread API,百万级并发,适合大量I/O阻塞操作,不适合CPU密集短任务

比喻记忆共享管家 vs 专属服务员

  • 传统线程:每桌客人配专属服务员。客人看菜单犹豫时,服务员站旁边干等(线程阻塞),啥也干不了。100桌就得雇100个服务员,人力成本爆表。
  • 虚拟线程:5个万能管家服务1000桌。A犹豫时管家立刻去B倒水,去C结账。管家随身笔记(可动态伸缩的栈)记录每桌当前状态,随时回来接着服务。客人完全不觉得有差,人力成本骤降。

🔍 核心差异

对比点传统平台线程虚拟线程
本质OS线程包装JVM管理轻量对象
数量上限几千~几万百万级
创建成本高(~1MB栈)极低(动态栈)
阻塞行为占用OS线程不放自动卸载,释放载体
池化必须池化复用无需池化

💡 一句话总结虚拟线程让阻塞等待不再浪费CPU资源,百万并发不是梦,同步代码享异步性能。

第78题:Spring WebFlux vs Spring MVC

一图看清

Spring MVC:Servlet同步阻塞模型,一个请求一个线程,堆栈大,并发有限
Spring WebFlux:基于Reactor/Netty,异步非阻塞,少量线程处理大量连接
  需要全链路响应式(数据库驱动、Redis驱动均需响应式)才有效

比喻记忆自助点餐机 vs 柜台

  • MVC:每个顾客配一个收银员,顾客犹豫时收银员干等。100个顾客要100个收银员。
  • WebFlux:几台自助点餐屏幕,顾客自己慢慢看慢慢选,屏幕同时服务几十人。少量屏幕就能应对大批顾客。
  • 前提:后厨也得是高效的——从点餐、做菜到出餐全链路都得快(全链路响应式),单点快而做菜慢也没用。

🔍 核心差异

对比点Spring MVCSpring WebFlux
底层Servlet(同步阻塞)Netty/Reactor(异步非阻塞)
线程模型一请求一线程少量线程高并发
适用传统CRUD高并发I/O、网关
前提需全链路响应式

💡 一句话总结MVC一请求一线程,WebFlux少量线程高并发,异步非阻塞,需全链路配合。

第79题:Sealed Class + 模式匹配优化代码

一图看清

传统写法:if (shape instanceof Circle) { Circle c = (Circle) shape; c.area(); }
           else if (...) ... → instanceof地狱,漏分支运行时报错

Sealed Class (JDK17):permits Circle, Rectangle → 编译器知道所有子类
模式匹配 switch (JDK21正式):自动类型判断 + 解构,无需强转,编译器检查完备性

效果:漏分支编译器直接报错,代码安全简洁

比喻记忆食堂自动打菜机

  • 传统写法:阿姨拿勺子每道菜看一遍,“这是宫保鸡丁吗?舀一勺”。“这是鱼香肉丝吗?舀一勺”——每种菜都要问。
  • Sealed Class:食堂公示今天只供应宫保鸡丁、鱼香肉丝、西红柿炒蛋(permits)。不可能有第四道。
  • 模式匹配:自动打菜机,按“鱼香肉丝”按钮,机器自动识别、装盘、出餐。绝不会装错菜。
  • 组合效果:哪天新增“麻婆豆腐”,机器直接报红(编译错误),逼你加新按钮。杜绝遗漏。

🔍 特性拆解

特性JDK版本作用
Sealed ClassJDK 17permits明确允许的子类列表
模式匹配 for switchJDK 21正式自动类型判断+解构,无需强转
记录类(Record)JDK 16自动生成构造/getter/equals

💡 一句话总结Sealed限定子类范围,模式匹配省去强转,编译器检查完备性,安全简洁。

第80题:JVM / 数据库调优实战案例

一图看清

JVM调优典型场景:
  现象:频繁Full GC,服务卡顿
  排查:jstat -gc → 老年代持续增长 → jmap dump → MAT分析
  根因:SQL结果集未及时关闭,大对象不断进入老年代
  解决:连接池加泄露检测 + try-with-resources + 增大年轻代

数据库调优典型场景:
  现象:慢查询,多表关联全表扫描
  排查:EXPLAIN → type=ALL,无索引 → 创建联合索引(user_id, create_time)
  效果:4s → 20ms
  PG额外动作:VACUUM ANALYZE更新统计信息

比喻记忆医生看诊

  • 望闻问切:jstat监控=体温表,dump堆=拍CT,GC日志=问诊记录,EXPLAIN=检查路线图。
  • 开药:调JVM参数=调整作息饮食,加索引=补充营养,改代码=改变不良生活习惯。
  • 复诊:上线后再监控,确认问题是否解决。

💡 一句话总结监控定位现象→dump/EXPLAIN定位根源→代码或参数修复→上线验证,先定位再下药。

第81题:千万级大表查询优化(MySQL vs PostgreSQL)

一图看清

通用三板斧:
  合适索引(覆盖索引优先)、避免SELECT *、分区表、冷热数据归档、读写分离

MySQL方案:
  EXPLAIN关注type和Extra,避免ALL和Using filesort/Using temporary
  分批LIMIT,必要时分库分表中间件(ShardingSphere)

PostgreSQL独有优势:
  BRIN索引 → 极小体积处理数十亿行的顺序时间字段
  GIN/GiST → JSONB和全文检索的高效索引
  并行查询 → max_parallel_workers提升聚合速度
  物化视图 → 复杂聚合结果预计算
  VACUUM ANALYZE → 定期更新统计信息

比喻记忆图书馆大翻新

  • 索引:目录卡片,查书名不用走遍全馆。
  • 分区:按年代分展区,找2020年代的书只跑一个区。
  • 归档:冷门书送地下室,热门书留一楼。
  • BRIN:每个书架只贴“本书架:1990~2000”。找1995的跳过前面20个架。
  • 并行查询:把查询任务分给多个人同时在不同书架找,最后汇总。

💡 一句话总结索引+分区+归档是通用三板斧,PG有BRIN和并行查询两大独门杀器。

第82题:消息队列高可靠 + 死信队列设计

一图看清

消息可靠三要素:
  持久化 → 消息写入磁盘
  生产者确认 → Broker Ack确认收到
  消费者手动ACK → 处理完才确认

死信队列触发条件:
  消息被拒绝(basic.reject)、TTL超时、队列满、重试次数耗尽

处理流程:原队列 → 重试N次 → 转入死信队列 → 人工处理或定时重新投递

RabbitMQ:声明死信交换机+队列,设置 x-dead-letter-exchange
Redis Stream:XPENDING查未确认,XCLAIM转移超时消息

比喻记忆邮局退回机制

  • 正常投递:邮递员送信,敲门有人签收(手动ACK),完成。
  • 重试:没人签收?第二天再来,连续3天。
  • 死信:3次都失败,退回邮局死信处(死信队列),贴条“无法投递——查无此人”。管理员定期来检查死信,决定重新投递还是销毁。
  • 兜底:如果有人投诉一直没收到信(对账),人工介入查到死信,重发。

💡 一句话总结消息靠持久化+确认+重试保可靠,重试耗尽入死信,人工兜底。

第83题:云原生与容器化部署对Java的影响

一图看清

镜像体积 → GraalVM Native Image / jlink裁剪JRE → 秒级启动,几十MB
启动速度 → Spring Boot 3+ AOT编译、类预解析
内存感知 → JDK 8u191+ UseContainerSupport(默认开启,JDK21进一步优化)
优雅下线 → K8s preStop hook + Spring graceful shutdown
健康检查 → readiness / liveness probe
配置外挂 → ConfigMap / Secret,分离配置与镜像

比喻记忆外卖预制菜 vs 现场炒菜

  • 传统部署:厨师现场炒菜,备菜慢(启动慢),占厨房大(内存多),每盘口味可能有差异(环境差异)。
  • 容器化:预制菜包,开袋加热就吃(秒级启动),每包规格一致(环境一致性),吃多少加热多少(弹性伸缩)。
  • GraalVM Native Image:即食罐头,打开就吃(本地可执行文件),极小(几十MB),启动毫秒级。

🔍 容器化六大影响

影响方案
镜像体积GraalVM Native Image、jlink
启动速度AOT编译、类预解析
内存感知UseContainerSupport(JDK8u191+默认)
优雅下线preStop hook + graceful shutdown
健康检查readiness/liveness probe
配置外挂ConfigMap/Secret

💡 一句话总结容器化要求Java轻量化、快启动、感知容器限制、优雅退场。

第84题:单元测试 vs 集成测试 vs E2E

一图看清

测试金字塔(从底到顶):
  单元测试(最多):方法/类级,mock所有外部依赖,极快,精准定位
  集成测试(中量):多模块交互,可用Testcontainers启真实数据库
  E2E测试(少量):全链路到界面,真实环境,慢,维护成本高

覆盖率工具:JaCoCo设置阈值,CI/CD中管控质量门槛
注意:覆盖率数值≠测试质量,需结合Code Review和变异测试

比喻记忆造车质检三步

  • 单元测试:零件质检——每个螺丝、轮胎单独测是否合格。快,出问题精准定位到哪个零件。
  • 集成测试:部件装配检测——发动机装到车身上,启动看传动是否正常。验证模块间配合。
  • E2E测试:整车路试——开上真实道路,0加速到100,刹停,过弯。最真实但最贵,不会每辆车都做全套。

🔍 三种测试对比

类型范围速度Mock维护成本
单元测试方法/类极快mock所有外部依赖
集成测试多模块/数据库中等可用Testcontainers真实DB
E2E全链路不mock

💡 一句话总结单元测零件、集成测装配、E2E测整车,金字塔底层铺厚上层才稳。

第85题:设计模式实战——策略模式案例

一图看清

策略接口(PaymentStrategy):pay(amount)
  ├─ 微信支付(WechatPay):调用微信API
  ├─ 支付宝(AliPay):调用支付宝API
  └─ 银行卡(BankPay):调用银行接口

上下文(PaymentContext):持有一个策略引用,对外屏蔽调用细节
新增支付方式:只需新增策略实现类,不改旧代码 → 开闭原则

比喻记忆打车软件选车型

  • 策略接口:“出行方式”,定义从A到B的方法。
  • 具体策略:快车=省钱算法派轿车,专车=舒适算法派豪华车,拼车=最省钱算法顺路拼人。
  • 上下文:你只需说“从公司回家”,系统根据你选的车型自动匹配策略。
  • 扩展性:哪天滴滴增加“无人车”,只需新增一个无人车策略实现接口,其他代码不用改——对扩展开放,对修改封闭。

🔍 模式三要素

角色职责
Strategy接口定义算法族
ConcreteStrategy具体算法实现
Context上下文持有策略,对外屏蔽细节

💡 一句话总结策略模式=定义算法接口+多实现,调用方选策略,新增不改旧代码,符合开闭原则。


🎯 全系列完结

85道题,6篇文章,从基础到高阶,从HashMap到秒杀系统。

回顾这一路:方法论 → 基础核心29题 → 并发+JVM 14题 → Spring+数据库17题 → Redis缓存8题 → 高阶架构8题 → 高阶特性实战9题。

每一道题都是“图解+比喻+一句话总结”的四层结构,目的不是让你背,而是让你看见画面、想起故事、讲出不一样的内容。

如果这套题库对你有帮助,评论区告诉我哪道题的比喻让你印象最深。还想看到什么样的内容?面试回答技巧、大厂真题拆解、项目经验包装……告诉我,下一系列见。


上一篇: 高阶架构设计篇
🎯 全系列85题到此结束。如果这套题库对你有帮助,评论区告诉我哪道题的比喻让你印象最深。
想系统深入地掌握Java,从入门到拿到Offer,姊妹系列《Java 100天进阶之路》正在持续更新,每天30分钟,100天达到就业水平。
👉 《Java 100天进阶之路 · 完整目录》
👉 点击关注我 📂 返回全系列导航
📌 除了Java,我也在深挖智能物流实战(出版社WMS、托盘调度、机器学习落地)。如果你对技术在不同领域的实战感兴趣,欢迎点击我的头像,看看专栏《出版社物流WMS智能调度实战》。技术相通,思路可鉴。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值