2026-10-30 16:14:57
以下是针对鼎捷实习Java面试常见问题的详细解答:
1. Spring Boot自动装配原理启动时加载SpringFactoriesLoader,读取所有spring.factories文件中的自动配置类。
根据当前项目的依赖(如存在DataSource则配置JDBC)和条件注解决定是否生效。
通过@Import将配置类注入IoC容器。
spring-boot-starter-web:支持Web开发(包含Tomcat和Spring MVC)。
spring-boot-starter-data-jpa:集成JPA和Hibernate。
spring-boot-starter-redis:支持Redis缓存。
spring-boot-starter-test:提供单元测试工具(如JUnit、Mockito)。
Quartz:支持复杂调度(如分布式任务、持久化)。
Elastic-Job:分布式任务调度框架,基于Zookeeper实现高可用。
实体类(@Entity)、Repository接口(继承JpaRepository)。
Controller层(@RestController)和Service层。
Redis基于内存操作,单线程可避免多线程竞争和上下文切换开销。
通过I/O多路复用(如epoll)实现高并发。
原子性操作:所有命令支持原子执行。
持久化:支持RDB和AOF。
数据结构丰富:支持String、Hash、List、Set等。
优点:二进制文件体积小,恢复速度快。
缺点:可能丢失最后一次快照后的数据。
优点:数据安全性高(可配置每秒同步或每次写入同步)。
缺点:文件体积大,恢复速度慢。
秒杀系统防止超卖。
订单支付防重复提交。
分布式任务调度。
B+树:主流选择,支持范围查询和排序。
Hash:仅支持等值查询(如Memory引擎)。
InnoDB:支持事务、行级锁、外键。
MyISAM:不支持事务,表级锁,适合读多写少场景。
用户表(user)、菜单表(menu)、订单表(order)、订单详情表(order_detail)、套餐表(set_meal)、套餐菜品关联表(set_meal_menu)等,通常6-10张表。
第一范式:字段不可再分(如地址拆分为省、市、区)。
第二范式:非主键字段完全依赖主键(如订单表需包含用户ID而非用户名)。
第三范式:非主键字段无传递依赖(如用户表不存储城市名称,仅存储城市ID)。
多表查询:通过JOIN直接获取菜品名称(如SELECT set_meal.*, menu.name FROM set_meal JOIN set_meal_menu ON ... JOIN menu ON ...)。
缓存优化:将套餐与菜品信息缓存到Redis,减少数据库查询。
解耦:短链接生成服务与存储服务分离。
异步处理:提高系统吞吐量。
削峰填谷:应对高并发请求。
高可用:支持主从架构和消息刷盘。
顺序消息:保证短链接生成的顺序性。
分布式事务支持:确保生成与存储的原子性。
方法区:存储类信息、常量、静态变量(JDK 8后改为元空间,位于直接内存)。
堆:存储所有对象实例和数组。
类加载时将方法字节码存入方法区。
调用方法时,JVM在栈帧中分配局部变量表和操作数栈。
执行引擎解释或编译字节码为机器指令。
BootstrapClassLoader:加载JAVA_HOME/lib下的核心类。
ExtensionClassLoader:加载JAVA_HOME/lib/ext下的扩展类。
ApplicationClassLoader:加载classpath下的应用类。
避免类重复加载(如java.lang.String始终由BootstrapClassLoader加载)。
保证核心类不被篡改(如防止自定义String类覆盖JDK原生类)。
标记-清除:标记垃圾后直接清除(产生内存碎片)。
标记-整理:标记后压缩内存(消除碎片但效率低)。
复制算法:将存活对象复制到另一块内存(适用于新生代,如Eden区)。
内存碎片化严重,可能导致大对象分配失败。
需额外空间存储标记信息。
Eden区:新对象分配区域。
Survivor区:分为From和To,用于Minor GC后的对象复制。
数据库连接泄漏:通过try-with-resources和连接池监控解决。
Redis缓存穿透:对空值缓存或使用布隆过滤器过滤无效请求。
线程池资源耗尽:动态调整线程池参数(如核心线程数、队列容量)。
以上内容覆盖了鼎捷实习Java面试的核心知识点,建议结合实际项目经验深入理解。