面试专题
Hutool 面试题的重点不是记住多少个工具类,而是说明一个工具库如何把复杂能力压缩成易用 API,同时保留类型、资源、线程和安全边界。
先给答案:Hutool 面试题的重点不是记住多少个工具类,而是说明一个工具库如何把复杂能力压缩成易用 API,同时保…
Section titled “先给答案:Hutool 面试题的重点不是记住多少个工具类,而是说明一个工具库如何把复杂能力压缩成易用 API,同时保…”Hutool 面试题的重点不是记住多少个工具类,而是说明一个工具库如何把复杂能力压缩成易用 API,同时保留类型、资源、线程和安全边界。 正文沿“高频题 -> 场景题”展开:先确认入口和状态归属,再跟踪控制流或数据流的推进,最后落到对外可观察的结果。
主要失效边界集中在“HTTP 调用偶发连接泄漏,怎么排查、配置转换失败却没有报警,怎么办、POI 导入大文件内存暴涨,怎么改”这些场景。它们破坏的是容量、顺序、并发或生命周期前提;排查时应先确认状态是否仍由正确对象持有,再核对推进条件和清理路径。
为什么 Hutool 采用大量静态工具类?
Section titled “为什么 Hutool 采用大量静态工具类?”静态入口适合无状态、低配置、高频操作,可以减少样板代码。需要持有请求配置、连接、工作簿或配置文件时,源码会转向 HttpRequest、Setting、ExcelWriter 等对象,静态门面只是创建或委托入口。
Convert 为什么要同时支持 Class 和 Type?
Section titled “Convert 为什么要同时支持 Class 和 Type?”Class 只能表达原始类型或容器本身,Type 可以保留 List<User>、Map<String, Long> 的参数化信息。转换器必须根据目标类型递归决定元素、键和值的转换策略。
反射工具如何处理重载?
Section titled “反射工具如何处理重载?”先根据名称、参数数量和参数类型筛选,再处理包装类型、继承关系和可访问性;不能因为某个方法能被调用就认为它是正确重载。缓存也要以完整签名或等价上下文为边界。
Hutool 的模块拆分解决了什么问题?
Section titled “Hutool 的模块拆分解决了什么问题?”把无第三方依赖的 core 与 HTTP、JSON、POI、Crypto 等能力隔离,控制传递依赖、启动成本和版本冲突。聚合包方便接入,但不应成为所有服务的默认依赖。
HTTP 调用偶发连接泄漏,怎么排查?
Section titled “HTTP 调用偶发连接泄漏,怎么排查?”检查 HttpResponse 和响应流的关闭路径,区分异常发生在连接、读取、解码还是业务处理阶段;确认大响应是否被一次性读入内存,并检查连接复用和超时配置。
配置转换失败却没有报警,怎么办?
Section titled “配置转换失败却没有报警,怎么办?”把缺失、空值、非法格式和默认值分开记录;关键配置在启动阶段使用显式校验,避免所有错误都被 getXXX(key, default) 静默吞掉。
POI 导入大文件内存暴涨,怎么改?
Section titled “POI 导入大文件内存暴涨,怎么改?”从全量 List 转换改为逐行或批量回调,及时释放工作簿和输入流;同时限制单元格长度、行数和用户可控公式,避免内存与注入风险。
工具库升级后行为变化,如何回归?
Section titled “工具库升级后行为变化,如何回归?”为日期格式、数字精度、空值、JSON 类型、Bean 拷贝 null 策略和异常类型建立契约测试;不要只用“正常输入能跑通”作为兼容性判断。
面试锚点
- 静态门面、状态对象和底层适配器如何分工?
- 工具库的默认值策略何时提高可用性,何时隐藏故障?
- 资源关闭、反射授权和密码算法配置为什么不能由短 API 自动替业务决定?