多益网络 Java 后端一面:MySQL 索引、深拷贝与场景题
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 拷打项目:介绍项目并接受细节追问。
- 拷打实习经历:开发只有你一个人,具体是怎么推进的?
- MySQL 索引相关问题。
- Java 的深拷贝怎么实现?
clone是深拷贝还是浅拷贝? - 算法题(hot100):轮转数组。
- 场景题:高德地图怎么预测到达时间?
《参考解析》
Java 深拷贝的实现方式:Object.clone() 是浅拷贝——它按字段做逐位复制,基本类型字段互不影响,但引用类型字段复制的是同一个地址,改其中一个对象里的引用对象,另一个也跟着变。要实现深拷贝有三条常见路子:一是手写复制,new 一个新对象再逐字段赋值,引用字段递归地 new(也就是原帖里说的做法),可控、无依赖,缺点是字段一多就容易漏、嵌套深了代码膨胀;二是递归调 clone,在每一层都实现 Cloneable 并覆写 clone,在父对象的 clone 里对每个引用字段再调一次 clone,坑在于遇到循环引用会无限递归,而且每加一个字段就得记得改 clone;三是序列化再反序列化,把对象写成字节流再读回来,天然处理嵌套与循环引用,Java 原生序列化要求所有类实现 Serializable(且性能一般),工程上更常用 JSON(Jackson)或 Kryo、Protobuf 这类序列化框架,速度快但要确认类型信息不丢(多态字段需要类型标记)。第三种最省心也最常用,代价是性能与「不适合序列化的字段(连接、锁、ThreadLocal)」要标 transient 或忽略。追问方向通常是「不可变对象还需要深拷贝吗」——不需要,像 String、包装类、record 这类不可变对象可以直接共享引用。
MySQL 索引的几个必答点:InnoDB 用 B+ 树作为索引结构,原因是它矮胖(三层能存千万级)、叶子节点成链支持范围扫描、非叶子节点只存键不存数据所以单页能放更多键。要分清聚簇索引与二级索引:聚簇索引的叶子节点就是整行数据,按主键组织,所以主键要短且递增(随机主键会导致页分裂与碎片);二级索引叶子存的是索引列 + 主键值,因此用二级索引查非索引列需要回表,而如果查询字段都在索引里就是覆盖索引,能避免回表。使用规则上要记住最左前缀:联合索引 (a, b, c) 能支持 a、a,b、a,b,c 的前缀查询,跳过 a 直接查 b 用不上索引(MySQL 8 的索引下推能在部分场景减少回表,但扫描范围不变)。典型的索引失效场景:在索引列上做函数运算或隐式类型转换(字符串列传数字)、以 % 开头的模糊匹配、or 连接的条件里有一侧没索引、范围查询后面的列用不上联合索引。最后补一句评估手段:用 explain 看 type(ref/range 比 index/all 好)、key、rows 和 Extra 里的 Using index(覆盖索引)与 Using filesort。
轮转数组:典型题面是「把数组向右轮转 k 位,要求空间 O(1)」。最优解是三次翻转:先把整个数组翻转,再把前 k 个翻转、后 n-k 个翻转,结果正好是右移 k 位,时间 O(n)、空间 O(1)。为什么成立可以用小例子验证,[1,2,3,4,5,6,7]、k=3 整体翻转得 [7,6,5,4,3,2,1],前 3 个翻转得 [5,6,7,4,3,2,1],后 4 个翻转得 [5,6,7,1,2,3,4],正确。三个必须处理的边界:k 要对 n 取模(k %= n,否则 k > n 时翻转区间越界);n == 0 或 n == 1 直接返回;k == 0 时不要做任何翻转。另一种做法是环状替换(从起点开始把元素放到 (i + k) % n,走完一圈换起点,需要 gcd 次循环,容易写错)和额外数组(newArr[(i + k) % n] = nums[i],O(n) 空间,最不容易出错)。面试时可以先说额外数组的解法确认题意,再优化到三次翻转,并主动讲清边界的处理,比直接背最优解更稳。
高德地图怎么预测到达时间(ETA):这是标准的场景设计题,答题框架是「数据 → 模型 → 服务 → 兜底」。数据侧要拿四类:静态路网(路段长度、等级、限速、车道数、转向限制、路口数量与红绿灯配时)、实时路况(浮动车轨迹、拥堵指数、事故与施工事件、天气)、历史画像(同一路段按星期几、小时、节假日的通行速度分布)、个体因素(出行方式、车型、是否走高速、用户历史偏好)。模型侧分两段:先把路径规划出来(带时间依赖权重的最短路,边权是「当前预估通行时间」而不是距离,重规划时用增量算法避免全量重算),再对每段做分段耗时预测——短时用实时数据外推(卡尔曼滤波或滑动窗口),长时用历史画像加机器学习(GBDT 或时序模型,特征包括时段、路段属性、上下游路况、天气),最后把各段耗时求和并给出置信区间而不是一个点估计。工程上要解决冷启动(新路段用相似路段迁移)、稀疏数据(低频路段用路段等级做先验)、异常突变(事故导致的跳变要和缓变区分开,用事件源而不是统计外推)以及反馈闭环(实际到达时间回流训练,持续的偏差要能被检测和纠正)。评价指标是预测值与真实到达时间的误差分布(MAE/MAPE)和分位数覆盖率(说 30 分钟,80% 的情况真的在 30 分钟内到)。面试官通常接着追问「红绿灯怎么估」——答「优先用信号配时与路口转向代价,拿不到配时就按路口平均延误统计建模,并按时段修正」即可,重点展示分层与兜底思路,而不是给一个具体算法名。