2026-01-18 13:43:59
壹沓科技一面核心围绕Java技术栈、数据库、芦衡铅框架及中间件展开,涉及基础语法、原理、应用场景及问题排查能力,整体难度适中但覆盖面广,部分问题需结合实践深入理解。具体问题解析如下:
JDK版本特性
JDK8:核心特性包括Lambda表达式(简化函数式编程)、Stream API(支持链式数据操作)、默认方法(接口可提供实现)、Optional类(避免空指针异常)、新的日期时间API(如LocalDateTime)。
JDK11:作为LTS版本,新增局部变量类型推断(var关键字)、HTTP Client标准化、ZGC垃圾回收器(低延迟)、单文件源代码编译运行(无需构建工具)。考察点:版本特性需结合实际开发场景说明,如JDK8的Stream提升集合操作效率,JDK11的ZGC适合高并发场景。
ArrayList与LinkedList区别
底层结构:ArrayList基于动态数组,LinkedList基于双向链表。
操作效率:ArrayList随机访问(get/set)为O(1),插入/删除(非尾部)为O(n);LinkedList插入拦唤/删除为O(1),随机访问为O(n)。
内存占用:ArrayList额外空间用于扩容预留,LinkedList每个节点需存储前后指针。考察点:需从时间复杂度、内存结构、适用场景(如频繁查询选ArrayList,频繁增删选LinkedList)综合分析。
String、StringBuffer、StringBuilder区别
不可变性:String不可变,每次修改生成新对象;StringBuffer/StringBuilder可变。
线程安全:StringBuffer方法加synchronized,线程安全但性能低;StringBuilder非线程安全,性能高。
使用场景:单线程高频修改用StringBuilder,多线程环境用StringBuffer,String适合常量拼接。考察点:需明确不可变性的设计意义(如线程安全、缓存哈希值)及性能差异。
final关键字作用
变量:初始化后不可重新赋值(基本类型值不变,引用类型指向不变)。
方法:不可被子类重写。
类:不可被继承(如String类)。考察点:需结合设计模式(如模板方法模式中final限制子类行为)说明应用价值。
SQL执行计划查看与优化
查看方式:MySQL通过EXPLAIN关键字分析执行计划,关注type(访问类型,如ALL全表扫描、ref索引扫描)、key(是否使用索引)、rows(预估扫描行数)、Extra(额外信息,如Using filesort)。
优化方向:避免全表扫描(添加合适索引)、减少排序操作(优化ORDER BY)、避免子查询(改用JOIN)。考察点:需体现对SQL性能瓶颈的定位能力,如索引失效场景(如函数操作字段、隐式类型转换)。
MySQL事务隔离级别
读未提交(Read Uncommitted):可能读到未提交数据(脏读)。
读陪好已提交(Read Committed):避免脏读,但可能不可重复读(同一事务内两次读取结果不同)。
可重复读(Repeatable Read,MySQL默认):避免脏读和不可重复读,但可能幻读(其他事务插入新数据)。
串行化(Serializable):最高隔离级别,通过锁完全避免并发问题,但性能最低。考察点:需说明各级别解决的问题及MySQL通过MVCC实现可重复读的原理。
MyBatis #{}与${}区别
#{}:预编译参数,防止SQL注入(如WHERE id = #{id}编译为WHERE id = ?)。
${}:直接拼接字符串,存在注入风险(如ORDER BY ${column}可能被恶意修改)。考察点:需强调安全风险,并说明动态表名/列名等特殊场景下${}的必要性。
Spring核心概念
AOP:面向切面编程,通过动态代理(JDK/CGLIB)实现横切关注点(如日志、事务)的模块化,核心概念包括切面(Aspect)、切入点(Pointcut)、通知(Advice)。
IOC:控制反转,由容器管理Bean生命周期(创建、依赖注入、销毁),通过依赖注入(DI)降低耦合度。
Bean生命周期:实例化→属性赋值→初始化(@PostConstruct)→使用→销毁(@PreDestroy)。
Bean作用域:Singleton(默认,单例)、Prototype(每次请求新实例)、Request/Session(Web环境)。
事务失效场景:方法被private修饰、异常未被@Transactional捕获(如RuntimeException)、同一类中方法调用(代理失效)。考察点:需结合代码示例说明原理,如AOP通过代理增强方法,IOC通过反射实现依赖注入。
RocketMQ与Redis应用
RocketMQ:核心概念包括Topic(消息分类)、Group(消费者分组)、Tag(消息标签)。项目中可能用于异步解耦(如订单创建后发送消息通知库存服务)、削峰填谷(如秒杀场景)。
重复消费解决:通过消息唯一ID实现幂等性(如数据库唯一索引、Redis Set去重)。
Redis数据结构:String(缓存)、Hash(对象存储)、List(消息队列)、Set(去重)、ZSet(排序场景)。考察点:需说明中间件选型依据(如RocketMQ适合高吞吐、Redis适合低延迟缓存)及实际问题的解决方案。
双亲委派机制
原理:类加载器收到加载请求时,先委托父加载器尝试加载,父无法加载再由子加载器加载。
目的:避免类重复加载(如防止核心API被篡改)、保证类唯一性。考察点:需结合破坏双亲委派的场景(如Tomcat自定义类加载器加载Web应用)说明其重要性。
改进建议: