得物后端开发面试题汇总
《面试题目》
- 如何安全比较两个浮点数相等
- 通过两个浮点数的绝对差来比较,在实际开发中怎么确定阈值大小?
- 通过绝对差来比较的场景、边界和原理
- 什么是双端队列,和传统队列、栈的区别和优势,特性以及在实际应用中的场景和好处
- 双端队列在滑动窗口中求最大最小值的工作原理
- Java中全局变量和局部变量的区别
- 在开发场景中,你是怎么根据这些区别来选择全局变量还是局部变量的
- 为什么栈里的局部变量是线程私有,堆里的全局变量是线程共享?
- ArrayList和LinkedList的区别,在那种场景下选择什么容器
- 频繁在ArrayList中间位置插入元素,怎么优化性能问题
- 解释SQL中的select语句的基本结构,举例如何使用
- 两表内联查询怎么构造sql语句
- on和where的区别
- 消息中间件的理解和应用场景
- Kafka消息堆积怎么处理
- 一个分区只能被一个消费者组的一个消费者消费的原因
- 如何确保Redis的性能和数据一致性,在高并发场景下
- Redisson实现分布式锁的原理和场景
- 将学术应用到实际项目中的例子,学到了什么
- 在项目中担任了什么职责,如何和团队协作
- 项目实现过程中遇到了哪些挑战、怎么解决的
- 是否出现过分歧和不同的技术主张,怎么协调的
- 如何分析复杂数据以做出决策
- 打破常规思维才能解决的问题,最终是通过什么样的方法解决的
《参考解析》
- 浮点数比较:直接用
==会因精度丢失失败。应采用Math.abs(a - b) < epsilon,其中epsilon取决于业务精度要求(如金融场景至少精确到分)。 - ArrayList优化:频繁中间插入可改用 LinkedList 或分段存储;若必须用 ArrayList,可考虑批量操作或改用
CopyOnWriteArrayList等并发容器,或优化数据结构设计减少插入频次。 - Kafka消息堆积:增加 Partition 和消费者线程数,开启并发消费;临时扩容或将消息写入临时库进行异步处理,优化消费逻辑性能。
- Redis数据一致性:采用“先写库,后删缓存”策略,结合延时双删或订阅Binlog(如Canal)同步,高并发下考虑分布式锁或Lua脚本保证原子性。
- Redisson分布式锁:基于 Redis 的 Hash 结构配合 Lua 脚本实现,具有可重入性,利用 WatchDog 机制实现锁自动续期,避免任务执行超时导致锁提前释放。