去哪儿旅行 Java AI 方向一面
面试题目
一、专业知识
- HTTP 和 HTTPS 的区别?HTTPS 是如何保证通信数据不被截取和篡改的?SSL 证书的机制是如何保证信息安全的?
- 哈希索引和 B+ 树索引的区别是什么?范围查询时用哪一种好?为什么?
- Java 并发编程中如何保证线程安全?详细阐述乐观锁和悲观锁?
- 用户注册、登录带验证码的系统要如何设计?密码等用户信息是如何处理的?你会选择哪一种方式加密?为什么?
二、项目与工作经验
- 过往经验中哪个项目最有挑战性?如何解决这个项目中出现的问题?(会根据回答进行追问)
- 简述在项目中如何与团队进行合作?团队协作中遇到哪些问题?如何解决?(有追问)
三、性格测试
约 70 道题,根据自身情况如实作答即可。
参考解析
Q1:HTTP vs HTTPS 与 SSL 机制
- HTTP 明文传输,HTTPS 在 HTTP 基础上加入 TLS/SSL 层,数据加密传输。
- HTTPS 通过非对称加密协商会话密钥,再用对称加密传输数据,保证机密性;通过 MAC/数字签名保证完整性,防篡改。
- SSL 证书由受信任的 CA 签发,客户端验证证书合法性(证书链、域名、有效期),防止中间人攻击,确保服务端身份真实。
Q2:哈希索引 vs B+ 树索引
- 哈希索引等值查询 O(1),但不支持范围查询、排序、模糊查询,也不支持联合索引的最左前缀匹配。
- B+ 树索引叶节点有序且通过链表连接,天然支持范围查询和排序,MySQL InnoDB 默认使用 B+ 树。
- 结论:范围查询选 B+ 树,哈希索引仅适合精确等值匹配场景(如 Memory 引擎)。
Q3:Java 线程安全 / 乐观锁 vs 悲观锁
- 常见手段:
synchronized、ReentrantLock、volatile、原子类(AtomicInteger等)、线程安全容器。 - 悲观锁:假设必然冲突,先加锁再操作;代表:
synchronized、数据库SELECT ... FOR UPDATE;适合写多场景。 - 乐观锁:假设冲突少,操作完成后通过 CAS 或版本号 校验是否冲突;代表:
AtomicInteger、数据库version字段;适合读多写少场景,无锁开销但冲突时需重试。
Q4:用户注册登录验证码系统设计与密码加密
- 验证码可用图形验证码(服务端生成存 Redis,TTL 5 分钟)或短信/邮箱 OTP。
- 密码存储绝对不能明文或简单 MD5,推荐使用 BCrypt(内置 salt、可调 cost 因子,抗彩虹表攻击);也可使用 Argon2 或 PBKDF2。
- 传输层依赖 HTTPS,服务端对密码字段加盐哈希后存储,登录时对输入密码同样哈希后比对。
- BCrypt 优势:每次生成随机 salt、计算慢(可配置),暴力破解成本极高,是当前 Web 系统推荐方案。