11.26

这几天又面试了4家,感觉从项目问的比较多,所以我把做过的项目重温了一下,把里面的主要面试点总结出来。

你说“精通多线程”,那讲讲线程池的核心参数?什么时候会创建非核心线程?
在项目中我们使用线程池处理异步日志上报和批量数据导入。线程池的 corePoolSize 设为 CPU 核数,maximumPoolSize 根据 IO 密集型任务设为 2 倍核数,队列用有界 ArrayBlockingQueue 防止 OOM。当任务提交时,如果核心线程忙且队列满,才会创建临时线程。

HashMap 在多线程下有什么问题?ConcurrentHashMap 是怎么解决的?
关于 HashMap,JDK 7 多线程下扩容可能形成环形链表导致死循环;JDK 8 虽然改为尾插法避免了环,但仍存在数据覆盖问题。所以我们高并发场景都用 ConcurrentHashMap,它通过分段锁(JDK 7)或 CAS + synchronized(JDK 8+)保证线程安全。

Git 用过哪些命令?怎么解决冲突?
日常开发用 Git 进行版本控制,常用 git rebase 整理提交历史,冲突时通过 IDEA 的 Merge 工具可视化解决。我们团队采用类似 Git Flow 的流程:master 发布,develop 开发,feature 分支做功能,MR 合并前需 Code Review。

Swagger 和 Apifox 有什么区别?为什么不用 Postman?
Swagger 用于自动生成接口文档并集成测试,适合开发阶段;Apifox 更适合测试和前后端联调,支持 Mock、自动化测试和团队协作,所以我们上线前用 Apifox 做回归测试。

责任链模式怎么实现?怎么调用下一个处理器?
在订单审核系统中,我们用了责任链模式:风控校验 → 库存校验 → 支付校验。每个校验器继承抽象类 Handler,持有 next 引用。如果当前校验不通过就抛异常,否则调用 next.handle()。链的组装通过 Spring 的 @PostConstruct 自动注入,新增校验器只需加注解,无需改主流程

MyBatis 和 MyBatis-Plus 有什么区别?MP 的自动填充怎么实现?
MyBatis-Plus 在 MyBatis 基础上提供了 ActiveRecord、条件构造器、分页插件等,极大减少样板代码。比如我们用 @TableField(fill = FieldFill.INSERT) 实现 create_time 自动填充,通过实现 MetaObjectHandler 接口完成。

Spring Boot 自动装配原理是什么?
Spring Boot 自动装配靠 @EnableAutoConfiguration,它会加载 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中的配置类,并通过 @Conditional 注解按条件生效,比如只有 classpath 有 Redis 才加载 RedisAutoConfiguration。

消费失败怎么办?有没有堆积?
我们曾因短信服务商限流导致消息堆积,后来加了消费速率监控,并在高峰期临时扩容消费者实例。对于订单状态变更这类需要顺序的场景,我们按 order_id 哈希到同一个 queue,单消费者处理保证顺序。

ES 和 MySQL 查询有什么区别?怎么解决深分页问题?数据怎么同步到 ES 的?
MySQL 适合精确查询和事务,ES 适合模糊搜索和聚合分析。比如商品搜索用 match_phrase 提升相关性,销量统计用 terms + sum 聚合。
深分页我们用 search_after 替代 from/size,基于上一页最后一条记录的 sort 值继续查,避免跳过大量数据。
数据同步通过 Canal 监听 MySQL binlog,解析后发到 RabbitMQ,消费者写入 ES。这样解耦且实时性高,延迟在 1 秒内。

集成过哪些服务?比如短信、OSS?
集成过阿里云短信(用户注册验证码)、腾讯云 COS(文件上传)。密钥不硬编码,而是放在 Nacos 配置中心,通过 @Value 注入,生产环境权限严格管控。

posted @ 2025-11-26 17:35  萌新求职记录  阅读(8)  评论(0)    收藏  举报