携程 Java 开发面试:并发集合、异步任务与千万用户排行榜
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 如何介绍自己的经历和技术背景?
- JDK 8 的 ConcurrentHashMap 为什么支持并发访问,size 怎样计算?
- CompletableFuture 与普通 Future 有什么区别,在业务中怎样使用?
- 实习承担什么业务,怎样与同事合作?
- 使用 Redis 怎样设计千万用户排行榜?
- 自己的 Agent 项目从何而来,对其实现理解到什么程度?
- GET 与 POST 有什么区别?
- 对岗位有什么了解,为什么选择携程?
《参考解析》
异步任务需要的是编排能力
Future 可以表示异步计算结果,但直接调用 get 会阻塞等待。CompletableFuture 支持完成后的回调、多个任务的组合及异常处理,适合把“并行查询,再汇总结果”表达成依赖关系。实际使用时要明确执行器、超时和失败处理,不能把所有阻塞调用都无差别塞入默认线程池。
排行榜先算内存,再谈分片
Redis 有序集合可以把用户标识作为 member、分数作为 score,支持更新分数和查询排名。千万用户场景要先估算成员长度、结构开销、更新频率,以及热榜查询量。同分规则也要提前定义。如果单个榜需要分片,全局排名与跨分片翻页就不再是一次本地查询,必须说明怎样合并;只保留前若干名又无法回答任意用户的完整排名。
并发计数的边界
JDK 8 的 ConcurrentHashMap 通过 CAS 与局部同步等方式协调更新,计数会分散到多个单元以降低竞争。size 汇总这些计数,在并发修改过程中不是整个映射的原子快照。因此不能用一次 size 判断来替代“检查后修改”所需的原子操作。
HTTP 方法要从语义答起
GET 用于获取资源,定义为安全且幂等的方法;POST 用于提交数据供目标资源处理,默认没有幂等保证。是否使用 HTTPS 与选择哪个方法是两回事,把数据放到 POST 请求体里不等于自动加密。