腾讯AI全栈开发实习一面面经
面试题目
- 项目经历:介绍项目,阐述亮点,指出遇到的问题及解决方案。
- Java基础:数组与链表的区别,详细对比时间空间复杂度。
- 并发编程:乐观锁与悲观锁的差异,ThreadLocal的原理及使用场景。
- 计算机网络:HTTPS加密原理;TCP三次握手为何不能是两次。
- MySQL:数据库相关基础(面试官未深究)。
- Redis:缓存击穿与缓存穿透的定义及解决方案。
- Spring与微服务:给出特定应用场景下的技术解决方案。
- 算法:无手撕代码。
参考解析
- 数组与链表:数组在内存中连续,支持随机访问(O(1)),但插入删除需移动元素;链表通过指针连接,插入删除快(O(1)),但空间开销大且不支持随机访问。
- 乐观锁与悲观锁:悲观锁(如synchronized)假设并发必发生,强制加锁;乐观锁(如CAS)假设冲突少,通过版本号机制重试,性能更高。
- ThreadLocal:每个线程维护一个本地变量副本,通过ThreadLocalMap存储,实现线程间数据隔离,常用于用户信息传递。
- TCP三次握手:两次握手无法防止已失效的连接请求突然又传送到服务端,导致资源浪费;三次握手确保双方接收/发送能力正常,同步序列号。
- 缓存穿透与击穿:穿透是请求不存在的key,需用布隆过滤器或缓存null值;击穿是热点key失效,需设置互斥锁或逻辑过期。