成都智算数联科技Java开发笔试+面试面经
《面试题目》
笔试题
- MyBatis 怎么实现批量插入?
- MyBatis 插入数据的时候怎么知道自增 ID?
- MySQL 和 Oracle 的分页关键字是什么?
- 删除一张表的全部数据的 SQL,两种方式?
- String、StringBuffer、StringBuilder 区别,项目中什么时候使用?
- Java 集合有什么,区别是什么?
- JDK 1.8 新特性?
- Linux 系统复制文件到其他目录的命令?
- Linux 系统常用的命令?
- 查看当前路径的命令?
- 接口文档基本内容?
- Redis 怎么设置键的生存时间和过期时间?
- Redis 分布式锁实现?
- 微服务五个核心组件?
- 创建线程几种方式?
- Spring Boot 怎么读配置文件?
面试
- 自我介绍。
- 介绍一下 JVM。
- 介绍一下 MySQL 优化。
- HashMap 底层原理,JDK 17 后做了哪些优化?
- Spring Boot 3 为什么要用 JDK 17,而不是 JDK 8?
- 谈谈你对数智化的理解。
- 你常用的 AI 工具有哪些?在项目中如何用 AI 工具?
- 薪资期望?
《参考解析》
1. MyBatis 批量插入与自增 ID 获取
批量插入用 <foreach> 标签拼接多组 values 一次性执行 INSERT,比循环单条插入性能高得多。获取自增 ID:在 <insert> 标签上配置 useGeneratedKeys="true" keyProperty="id",MyBatis 执行后会把数据库生成的自增主键自动回填到对应实体的属性中,无需额外查询。
2. MySQL 与 Oracle 分页
MySQL 用 LIMIT offset, size;Oracle 传统写法用 ROWNUM 配合子查询(Oracle 12c 之后也支持 OFFSET ... FETCH NEXT ... ROWS ONLY 标准语法)。
3. 清空表的两种方式
DELETE FROM table:逐行删除,可加 WHERE 条件,记录日志可回滚,不重置自增 ID,触发触发器;TRUNCATE TABLE table:直接释放数据页,速度快,重置自增 ID,不可回滚(DDL 操作),不触发触发器。
4. HashMap 底层原理与 JDK 17 优化
JDK 8 起 HashMap 底层是数组+链表+红黑树:链表长度 ≥ 8 且数组容量 ≥ 64 时树化为红黑树,降低哈希冲突下的查询复杂度从 O(n) 到 O(log n)。JDK 17(实际从 JDK 9 起持续优化)针对 HashMap 的优化包括:扩容时链表拆分算法优化(利用 hash & oldCap 直接判断节点在新表中的位置,无需重新计算 hash)、内部字段和方法的微调以配合 JIT 优化。需要注意「JDK 17 对 HashMap 做了哪些优化」更多是面试官泛泛一问,候选人可重点讲清 JDK7→JDK8 的链表转红黑树这一核心变化。
5. Spring Boot 3 要求 JDK 17 的原因
Spring Boot 3 全面拥抱 Jakarta EE 9+(javax.* 包名全部迁移到 jakarta.*),并且大量使用了 JDK 17 引入的新特性(如密封类 sealed classes、增强的 switch 表达式、性能更优的 G1/ZGC 垃圾回收器),同时 JDK 8 已停止主流支持,Spring 借此推动生态升级,JDK 17 是当时最新的 LTS 版本,兼具长期支持与性能提升(如更快的启动时间、更低的内存占用)。