得物后端开发面试题汇总

得物 · 后端开发 · AI面 · 2026-04

《面试题目》

  1. 如何安全比较两个浮点数相等
  2. 通过两个浮点数的绝对差来比较,在实际开发中怎么确定阈值大小?
  3. 通过绝对差来比较的场景、边界和原理
  4. 什么是双端队列,和传统队列、栈的区别和优势,特性以及在实际应用中的场景和好处
  5. 双端队列在滑动窗口中求最大最小值的工作原理
  6. Java中全局变量和局部变量的区别
  7. 在开发场景中,你是怎么根据这些区别来选择全局变量还是局部变量的
  8. 为什么栈里的局部变量是线程私有,堆里的全局变量是线程共享?
  9. ArrayList和LinkedList的区别,在那种场景下选择什么容器
  10. 频繁在ArrayList中间位置插入元素,怎么优化性能问题
  11. 解释SQL中的select语句的基本结构,举例如何使用
  12. 两表内联查询怎么构造sql语句
  13. on和where的区别
  14. 消息中间件的理解和应用场景
  15. Kafka消息堆积怎么处理
  16. 一个分区只能被一个消费者组的一个消费者消费的原因
  17. 如何确保Redis的性能和数据一致性,在高并发场景下
  18. Redisson实现分布式锁的原理和场景
  19. 将学术应用到实际项目中的例子,学到了什么
  20. 在项目中担任了什么职责,如何和团队协作
  21. 项目实现过程中遇到了哪些挑战、怎么解决的
  22. 是否出现过分歧和不同的技术主张,怎么协调的
  23. 如何分析复杂数据以做出决策
  24. 打破常规思维才能解决的问题,最终是通过什么样的方法解决的

《参考解析》

  • 浮点数比较:直接用 == 会因精度丢失失败。应采用 Math.abs(a - b) < epsilon,其中 epsilon 取决于业务精度要求(如金融场景至少精确到分)。
  • ArrayList优化:频繁中间插入可改用 LinkedList 或分段存储;若必须用 ArrayList,可考虑批量操作或改用 CopyOnWriteArrayList 等并发容器,或优化数据结构设计减少插入频次。
  • Kafka消息堆积:增加 Partition 和消费者线程数,开启并发消费;临时扩容或将消息写入临时库进行异步处理,优化消费逻辑性能。
  • Redis数据一致性:采用“先写库,后删缓存”策略,结合延时双删或订阅Binlog(如Canal)同步,高并发下考虑分布式锁或Lua脚本保证原子性。
  • Redisson分布式锁:基于 Redis 的 Hash 结构配合 Lua 脚本实现,具有可重入性,利用 WatchDog 机制实现锁自动续期,避免任务执行超时导致锁提前释放。