北京航天拓扑 Java 一面面经
《面试题目》
一、系统监控与链路追踪
- 在关键处理阶段实施埋点监控的通用性、透明度及链路串联实现方式。
- 如何通过唯一标识串联跨线程/跨系统的埋点数据。
- 可视化链路中成功/失败状态的判断逻辑与埋点关键字段定义。
- 监控与告警体系的基本原理及作用。
- 在现有项目中整合 Prometheus 的配置与开发流程。
二、微信开发
- 微信公众号接口鉴权原理及自动实现方式。
- 防范 AppID 冒用及伪造请求的风险策略。
三、算法与Java基础
- 描述一种熟悉的排序算法;解释快速排序的稳定性概念。
- Java中 == 运算符比较对象的潜在问题及 Integer 对象比较(==)的底层原理。
- 单例模式在多线程环境下的线程安全,以及常见解决手段。
- synchronized 和 Lock 的区别;实例方法上 synchronized 的锁对象指向。
四、数据库与工具
- MySQL SQL 优化经验;覆盖索引、聚簇索引与非聚簇索引区别。
- MyBatis 中 #{} 与 ${} 的区别及安全隐患。
- Linux 查看日志的常用命令。
《参考解析》
- 链路追踪与埋点:通常使用 TraceID 和 SpanID,在请求入口生成 TraceID,通过 ThreadLocal 或分布式链路追踪(如 SkyWalking)传递。
- Prometheus 整合:引入 Client 库,通过 Actuator 端点暴露 Metrics,配置 Prometheus Server 定时拉取数据。
- Integer比较:由于 Integer 缓存机制(-128至127),值在范围内 == 为 true,超出则为 false。建议一律使用 equals。
- 单例线程安全:默认懒汉式不安全,推荐使用双重校验锁(DCL)或枚举实现。锁对象需声明为 volatile 以防止指令重排。
- MyBatis #与$:#{} 采用预编译(PreparedStatement),可有效防止 SQL 注入;${} 为直接拼接,仅在动态表名/列名时使用。
- 索引优化:聚簇索引存数据,非聚簇索引存主键。覆盖索引指查询字段均在索引树上,无需回表,能极大提升查询速度。