帆书 Java 开发实习一面:断点续传、ES 场景与 MySQL 优化
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 请做一下自我介绍。
- 你项目中的创新点是什么?
- 你项目里的断点续传是怎么实现的?遇到了什么困难,如何解决的?
- 介绍一下 Elasticsearch 的应用场景和优缺点。
- 你做过哪些 MySQL 的优化方案?
- Object 类有哪些常用方法?
- Spring Cloud 的启动流程是怎样的?
- 值对象和应用对象有什么区别?
- 你的期望薪资是多少?
- 反问环节。
《参考解析》
断点续传怎么实现:分片、进度记录、校验三件事
答题骨架是「切分 → 记录 → 续传 → 合并校验」:把文件按固定大小切成若干分片(常见 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 再返回,避免字段泄漏和懒加载序列化问题。