南京莱斯-Java开发- 一面 面经
1、请做个简单的自我介绍
基本信息层面:
- 教育背景:[学校][专业]毕业,在校期间GPA排名前[X]%
- 技术栈掌握:熟练掌握Java核心技术、Spring生态、MySQL数据库调优、Redis缓存方案
项目经验层面:
- 参与过[X]个完整项目周期,涉及电商/金融/物流等领域
- 独立负责过[具体模块]的架构设计,日均处理[X]万级请求
- 解决过生产环境的性能瓶颈问题,将接口响应时间从[X]ms优化到[Y]ms
个人特质层面:
- 代码习惯:注重单元测试覆盖率,遵循阿里巴巴开发规范
- 学习能力:持续关注技术演进,阅读过Spring源码和JVM规范
- 协作意识:有Code Review经验,善于技术文档编写
2、Java中有哪些原始类型
整型家族(4种):
- byte:8位有符号,范围-128到127,常用于IO流操作节省内存
- short:16位有符号,范围-32768到32767,实际开发较少使用
- int:32位有符号,范围约±21亿,最常用的整数类型
- long:64位有符号,需要加L后缀,用于时间戳、大数值计算
浮点型家族(2种):
- float:32位单精度,精度约6-7位,金融计算禁用
- double:64位双精度,精度约15-16位,科学计算首选
其他类型(2种):
- char:16位Unicode字符,范围0到65535,可以存储中文
- boolean:理论1位但JVM实现为4字节,只有true/false
关键特性:
- 存储位置:栈内存直接存值,访问速度快
- 默认值:数值型为0,boolean为false,char为'\u0000'
- 自动装箱:JDK 1.5后可自动转换为包装类,但频繁装拆箱影响性能
3、SpringBoot中如何实现异步处理
配置启用层面:
- 启动类添加@EnableAsync注解激活异步功能
- 自定义线程池配置类实现AsyncConfigurer接口
- 设置核心参数:corePoolSize=8、maxPoolSize=16、queueCapacity=200、keepAliveSeconds=60
使用方式层面:
- 在Service方法上标注@Async("自定义线程池名称")
- 返回类型可以是void、Future<T>或CompletableFuture<T>
- 调用方通过Future.get()获取结果,支持超时控制
注意事项层面:
- 必须通过Spring容器注入调用,类内部直接调用会失效
- 异步方法必须是public修饰,private会被忽略
- 异常处理需要实现AsyncUncaughtExceptionHandler接口
- 事务传播需要特别注意,异步方法默认开启新事务
实战优化层面:
- 使用@Async("线程池名")区分不同业务场景的线程池
- 配置线程池拒绝策略为CallerRunsPolicy保证任务不丢失
- 监控线程池状态,通过Actuator暴露线程池指标
4、MySQL中如何关联查询多张表
JOIN类型详解:
- INNER JOIN:只返回匹配行,适用于必须存在关联的业务场景
- LEFT JOIN:保留左表全部数据,右表无匹配时填充NULL,常用于主表查询
- RIGHT JOIN:保留右表全部数据,实际开发中较少用,可用LEFT JOIN替代
- CROSS JOIN:笛卡尔积,两表记录数相乘,一般是SQL错误导致
关联条件设计:
- ON子句:指定关联字段,支持多条件AND连接
- WHERE子句:在关联后过滤数据,执行顺序在JOIN之后
- USING子句:当关联字段同名时的简化写法
性能优化要点:
- 关联字段必须建立索引,避免全表扫描
- 小表驱动大表原则,将数据量小的表放在前面
- 避免SELECT *,只查询需要的字段减少数据传输
- 超过3张表关联考虑分步查询或冗余字段设计
- 使用EXPLAIN分析执行计划,关注type和rows字段
替代方案:
- 子查询:IN/EXISTS适合一对多场景,但性能通常不如JOIN
- 应用层关联:先查主表再批量查从表,通过代码组装数据
- 数据冗余:高频查询场景通过字段冗余避免关联
5、数据库事务具备哪些核心特征
原子性(Atomicity):
- 定义:事务内所有操作要么全部成功,要么全部回滚
- 实现机制:通过undo log记录修改前的数据,回滚时恢复
- 典型场景:转账操作,扣款和加款必须同时成功
一致性(Consistency):
- 定义:事务执行前后数据库从一个一致性状态转到另一个一致性状态
- 约束保证:主键、外键、唯一索引、CHECK约束等
- 业务保证:账户余额不能为负、库存不能超卖等业务规则
隔离性(Isolation):
- 定义:并发事务之间互不干扰,通过隔离级别控制
- 四种级别:READ UNCOMMITTED(脏读)、READ COMMITTED(不可重复读)、REPEATABLE READ(幻读)、SERIALIZABLE(串行化)
- MySQL默认:REPEATABLE READ,通过MVCC和间隙锁解决幻读
- 实现机制:锁机制(悲观锁)和MVCC多版本并发控制(乐观锁)
持久性(Durability):
- 定义:事务提交后数据永久保存,系统崩溃也能恢复
- 实现机制:通过redo log记录已提交事务的修改
- 刷盘策略:innodb_flush_log_at_trx_commit=1保证每次提交都刷盘
实际应用考量:
- 隔离级别越高性能越低,需要根据业务场景权衡
- 分布式事务需要引入Seata等框架实现最终一致性
- 长事务会导致锁等待和undo log膨胀,应该拆分或异步化
6、String、StringBuilder、StringBuffer有什么区别
不可变性对比:
- String:final修饰的char数组,任何修改都创建新对象
- StringBuilder/StringB
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java面试圣经 文章被收录于专栏
Java面试圣经,带你练透java圣经
查看8道真题和解析