亚信科技初级Java(1-3年)面经
《面试题目》
- ArrayList 和 LinkedList 的区别,实际使用中如何选择?
- ArrayList 扩容一般扩多少?
- HashMap 的 put 流程?
- 项目中的全局异常处理是怎么做的?
- 统一返回封装在 Service 层还是 Controller 层?
- 生成 PDF 文件的系统架构,后端如何做动态内容渲染?
- 持久层用什么数据库,PDF 内容存在哪里?
- 只存文件没有存文本吗?数据量大不大?
- 项目开发人数、后端团队规模?
- Mybatis 防 SQL 注入一般用什么方式?
- Mybatis 分页怎么实现?
- 项目中对 MySQL 有没有做调优?
- 对底层 SQL 优化了解吗?比如数据量过大时如何保证增删改查效率?
- 项目中 Redis 用来做什么,用了哪些数据类型?
- 登录信息存储、超时如何处理?即将过期时是否会强制退出?如何设计滑动窗口过期?
- AI 工具的实际使用情况,是插件还是命令行形式?
- 有没有总结过给 AI 喂信息的模板?
《参考解析》
- ArrayList vs LinkedList:ArrayList 底层是数组,随机访问 O(1),插入/删除(非尾部)需要移动元素,平均 O(n);LinkedList 底层是双向链表,插入/删除 O(1)(已定位节点时),但随机访问需要遍历,平均 O(n)。频繁随机读选 ArrayList,频繁头尾插入删除选 LinkedList(或用 ArrayDeque)。
- HashMap put 流程:先对 key 计算 hash 并与数组长度取模定位桶;桶为空直接插入;桶不为空则遍历链表比较 key 是否相同,相同则覆盖 value,不同则尾插(JDK 1.8+);链表长度超过 8 且数组长度 ≥ 64 时树化为红黑树;插入后检查是否超过负载因子阈值(默认 0.75),超过则触发扩容(容量翻倍,重新计算元素位置)。
- 滑动窗口过期设计:登录态不设固定过期时间,而是每次用户有效操作时刷新过期时间(如 Redis
EXPIRE重置 TTL),只要用户持续活跃就不会被强制登出,超过窗口无操作才过期,常用于”记住登录状态”类场景。 - 分库分表思路:数据量过大时先按业务维度评估是垂直拆分(按表/字段拆到不同库)还是水平拆分(按行拆分,常见按用户 ID 或时间取模/范围分片);拆分后需解决跨库事务、跨库联表查询、全局唯一 ID 生成等问题,通常配合中间件(如 ShardingSphere)或在业务层做路由。