亚信科技初级Java(1-3年)面经

《面试题目》

  1. ArrayList 和 LinkedList 的区别,实际使用中如何选择?
  2. ArrayList 扩容一般扩多少?
  3. HashMap 的 put 流程?
  4. 项目中的全局异常处理是怎么做的?
  5. 统一返回封装在 Service 层还是 Controller 层?
  6. 生成 PDF 文件的系统架构,后端如何做动态内容渲染?
  7. 持久层用什么数据库,PDF 内容存在哪里?
  8. 只存文件没有存文本吗?数据量大不大?
  9. 项目开发人数、后端团队规模?
  10. Mybatis 防 SQL 注入一般用什么方式?
  11. Mybatis 分页怎么实现?
  12. 项目中对 MySQL 有没有做调优?
  13. 对底层 SQL 优化了解吗?比如数据量过大时如何保证增删改查效率?
  14. 项目中 Redis 用来做什么,用了哪些数据类型?
  15. 登录信息存储、超时如何处理?即将过期时是否会强制退出?如何设计滑动窗口过期?
  16. AI 工具的实际使用情况,是插件还是命令行形式?
  17. 有没有总结过给 AI 喂信息的模板?

《参考解析》

  1. ArrayList vs LinkedList:ArrayList 底层是数组,随机访问 O(1),插入/删除(非尾部)需要移动元素,平均 O(n);LinkedList 底层是双向链表,插入/删除 O(1)(已定位节点时),但随机访问需要遍历,平均 O(n)。频繁随机读选 ArrayList,频繁头尾插入删除选 LinkedList(或用 ArrayDeque)。
  2. HashMap put 流程:先对 key 计算 hash 并与数组长度取模定位桶;桶为空直接插入;桶不为空则遍历链表比较 key 是否相同,相同则覆盖 value,不同则尾插(JDK 1.8+);链表长度超过 8 且数组长度 ≥ 64 时树化为红黑树;插入后检查是否超过负载因子阈值(默认 0.75),超过则触发扩容(容量翻倍,重新计算元素位置)。
  3. 滑动窗口过期设计:登录态不设固定过期时间,而是每次用户有效操作时刷新过期时间(如 Redis EXPIRE 重置 TTL),只要用户持续活跃就不会被强制登出,超过窗口无操作才过期,常用于”记住登录状态”类场景。
  4. 分库分表思路:数据量过大时先按业务维度评估是垂直拆分(按表/字段拆到不同库)还是水平拆分(按行拆分,常见按用户 ID 或时间取模/范围分片);拆分后需解决跨库事务、跨库联表查询、全局唯一 ID 生成等问题,通常配合中间件(如 ShardingSphere)或在业务层做路由。