面灵AI→

帆书 Java 开发实习一面:断点续传、ES 场景与 MySQL 优化

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. 请做一下自我介绍。
  2. 你项目中的创新点是什么?
  3. 你项目里的断点续传是怎么实现的?遇到了什么困难,如何解决的?
  4. 介绍一下 Elasticsearch 的应用场景和优缺点。
  5. 你做过哪些 MySQL 的优化方案?
  6. Object 类有哪些常用方法?
  7. Spring Cloud 的启动流程是怎样的?
  8. 值对象和应用对象有什么区别?
  9. 你的期望薪资是多少?
  10. 反问环节。

《参考解析》

断点续传怎么实现:分片、进度记录、校验三件事

答题骨架是「切分 → 记录 → 续传 → 合并校验」:把文件按固定大小切成若干分片(常见 5MB 一档),前端上传前先调初始化接口,用文件 MD5 或内容 hash 让服务端判断是否已存在,存在就直接返回(秒传);上传中查「已上传分片列表」定位断点,只补缺失的分片;全部分片传完后调合并接口,服务端按分片序号顺序流式合并,再按 hash 校验完整性并落库。被追问困难时,最真实的三类坑是:一是断点记录放哪——进度既要快查(Redis 位图/集合)又要持久(落库),否则 Redis 一挂就从头传;二是并发分片乱序写同一文件——必须按序号排序写,用随机临时名加原子 rename,避免互相覆盖;三是幂等——同一分片重复上传要覆盖而不是追加,合并失败要能重跑,用「文件 hash + 分片序号」当幂等键。再补一句「大文件不读进内存,边收边写」,这一问基本就完整了。

Elasticsearch 的场景与代价、MySQL 优化怎么讲

ES 适合「全文检索 + 多条件组合过滤 + 聚合分析 + 海量日志写入」:倒排索引让「包含某个词」的查询做到毫秒级,近实时写入和分片水平扩展是它的强项,典型场景是商品搜索、站内搜索、日志检索、订单多维筛选。代价同样要讲:它不是权威数据源、没有事务,只能当检索副本,主数据仍在 MySQL,靠 binlog 订阅或双写同步,天然有延迟和不一致;运维成本高(堆内存、分片数、段合并);深分页很差,要用 search_after 而不是大 from + size。MySQL 优化按四层答——SQL 与索引(explain 看 type、key、rows,避免 select *、索引列上包函数、隐式类型转换、前缀模糊,联合索引守最左前缀,回表多就做覆盖索引)、表结构与数据类型、架构层(读写分离、分库分表、热点归档、缓存挡读)、以及最容易被忽略的一条:先用慢查询日志和 performance_schema 定位瓶颈再动手,而不是上来就加索引。

Object 常用方法、Spring Cloud 启动流程与值对象/应用对象

Object 的常用方法按面试频率列:equals / hashCode(契约是 equals 相等则 hashCode 必须相等,重写一个就必须重写另一个)、toString、getClass、clone(浅拷贝,需实现 Cloneable)、已废弃的 finalize,以及线程通信的 wait / notify / notifyAll。必然会追问「为什么重写 equals 要重写 hashCode」:HashMap 先按 hash 定位桶再 equals 比较,只重写 equals 会让两个「相等」的对象落到不同桶,出现查不到、去重失效。Spring Cloud 的启动流程按「取配置 → 建容器 → 刷新 → 注册 → 拉取」讲:启动阶段先加载远程配置(Nacos/Config,2020 版本之后改为 spring.config.import),再初始化 Spring 容器并创建 Bean;容器就绪后服务注册组件把实例信息注册到注册中心,同时拉取服务列表缓存到本地;之后由 LoadBalancer 做客户端负载均衡,OpenFeign 用动态代理把接口调用变成 HTTP 请求,Gateway 做统一入口、Sentinel 做限流熔断。值对象与应用对象的区别看「有没有身份」:值对象没有唯一标识,靠属性值判等、天然不可变(金额、坐标、时间区间),改值等于换一个新对象;应用/领域对象有唯一 id,id 相同即同一个实体,属性随时间变化、生命周期与数据库记录绑定。实践落点是分层转换——实体(Entity)不要直接暴露给前端,转成 DTO/VO 再返回,避免字段泄漏和懒加载序列化问题。