新大陆Java后端一面面经
《面试题目》
- 自我介绍,是否参加过算法比赛或刷题(LeetCode)。
- ArrayList 和 LinkedList 的区别?
- HashMap 的底层实现,如何扩容?扩容时用到的位运算原理是什么?
- 红黑树是如何通过旋转(左旋/右旋)保持平衡的?二叉树的前序遍历、后序遍历分别是怎样的?
- 谈谈对并发的理解,项目中哪些地方涉及并发?并发会带来哪些问题(如数据不一致)?
- IOC 和 DI 分别是什么?项目中哪些地方应用了 AOP?
- MySQL 的 binlog 是做什么的?事务执行异常时,如何知道某条数据是否插入完整(redo log 的作用)?
- 索引底层是什么数据结构?为什么?索引失效的常见场景有哪些?从数据结构角度解释为什么模糊查询前置通配符(
%xx)会导致索引失效,而后置通配符(xx%)不会。 - TCP/IP 协议分层,三次握手和四次挥手的具体过程与原因?
- HTTPS 是如何进行密钥传输和加密的?
- 是否熟悉 Linux?常用命令有哪些(ls、mkdir、cd、rm、cat、sudo)?
- Docker 的原理是什么?它是如何基于操作系统实现容器隔离的?镜像分层叠加的原理是什么?
- 消息重复提交、重复消费如何处理?
- 项目中 AI 生成代码的占比如何?针对 AI 辅助开发这种新模式,有什么心得?
《参考解析》
-
HashMap扩容与位运算:HashMap 1.8底层是数组+链表+红黑树,默认容量16、负载因子0.75,元素数超过阈值(容量×负载因子)时触发扩容为原来2倍。因为容量始终是2的幂次,计算下标用
(n-1) & hash位运算代替取模,效率更高;扩容时下标要么不变要么变为”原下标+旧容量”,可通过hash & oldCap位运算判断该节点扩容后落在哪个位置,避免重新计算hash。链表长度超过8且数组长度超过64时,链表树化为红黑树,将查询复杂度从O(n)降到O(logn)。 -
MySQL日志与事务原子性:redo log(重做日志)是InnoDB引擎层日志,记录物理页的修改,用于崩溃恢复保证事务的持久性(D);undo log记录数据修改前的镜像,用于事务回滚和MVCC。binlog是MySQL Server层日志,用于主从复制和数据恢复,记录逻辑操作。事务执行时先写redo log(prepare阶段)再写binlog,最后redo log提交(commit阶段),通过两阶段提交保证redo log和binlog的一致性——若事务异常中断,可通过redo log判断数据页修改是否完整来决定回滚。
-
索引失效原理:MySQL索引(B+树)本质是按索引列有序排列的数据结构。索引失效常见场景:对索引列做函数运算或隐式类型转换、
or连接非索引列、like '%xx'前置通配符、联合索引不满足最左前缀原则、!=或<>、索引列参与算术运算等。like 'xx%'因为B+树按字符串前缀有序存储,可以利用索引的有序性做范围扫描找到匹配区间;而like '%xx'前缀未知,无法在树上定位起始点,只能全表/全索引扫描。 -
TCP三次握手与HTTPS加密:三次握手:客户端发SYN→服务端回SYN+ACK→客户端回ACK,确保双方都验证了自己的收发能力正常,防止历史失效的连接请求突然到达服务端造成资源浪费。HTTPS使用非对称加密(RSA/ECDHE)传输对称密钥(协商生成会话密钥),再用该对称密钥(如AES)加密后续通信内容——非对称加密解决密钥安全交换问题,对称加密解决传输效率问题;证书由CA签发用于验证服务端身份、防止中间人攻击。
-
Docker容器隔离原理:Docker基于Linux内核的Namespace(实现PID、网络、挂载点、用户等资源隔离,让容器内看到独立的进程树和网络栈)和Cgroups(限制CPU、内存等资源使用量)实现轻量级隔离,无需像虚拟机那样虚拟化整个操作系统。镜像采用分层文件系统(如OverlayFS),每一层是只读的,容器运行时在最上层叠加一个可写层,多个容器可共享底层相同的只读层,从而节省存储空间并加快启动速度。