汉得信息Java开发面经
《面试题目》
1.自我介绍 2.简历中的项目如何部署上线简单复盘一下
实习拷打: 3.大数据量导出时,分批查询深度分页问题如何解决 4.复盘死锁场景是怎么产生的
项目拷打: 5.定时任务清理垃圾文件细节描述,边界如何处理
八股: 6.HashMap底层原理 7.线程池核心参数,每个参数的作用是什么 8.如果让你去设计一个后端的新增或者查询接口,你会去考虑哪些方面 9.接口防抖有哪些解决方案 10.Redis缓存穿透、击穿、雪崩如何产生,如何解决 11.Redis缓存和数据库的一致性如何保证 12.如果Redis挂了会发生什么,你会怎么处理 13.Redis的Key值一般如何设计 14.Redis常用的数据结构有哪些,分别用在什么场景 15.如何做后端接口的鉴权 16.如果某个接口突然变慢了,你会怎么去排查 17.数据库慢查询如何排查,Explain查询后的关键字介绍,每个关键字都有哪些值,代表什么含义 18.接口优化有哪些方式 19.索引失效的原因 20.平时学习过程中,遇到一个比较复杂的问题,解决思路是怎样的 21.如何定位线上bug 22.工作过程中,和其他同事在技术方案上有分歧如何处理 23.前端了解多少?部门前端也会涉及一些 24.用过哪些AI开发工具
《参考解析》
- 大数据量导出与深度分页: 避免使用
limit offset, size,改用游标查询(where id > last_id limit size)或使用ES进行分页。确保索引覆盖,减少回表。 - HashMap底层: 基于数组+链表/红黑树实现。JDK8在链表长度达到8且数组容量大于64时转为红黑树,提升查找效率(O(log n))。
- Redis缓存一致性: 推荐使用“延迟双删”或“先更新数据库,再删除缓存”。若对一致性要求极高,可使用Canal监听Binlog异步删除缓存。
- 数据库慢查询: 通过
slow_query_log定位,使用explain分析SQL。关注type(最好达到ref/range级别)、key(是否命中索引)和rows(扫描行数)。 - 线程池核心参数:
corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(空闲存活时间)、workQueue(阻塞队列)、handler(拒绝策略)。