面灵AI→

华为通用软件开发一面:内存结构、Redis 缓存与岛屿问题

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

《面试题目》

  1. 自我介绍。
  2. 项目中遇到过哪些困难?
  3. 有没有实习经历?
  4. 进程和线程的区别?
  5. 计算机内存的结构是怎样的?
  6. 用过什么数据库?
  7. Redis 的缓存机制是什么?为什么选择用 Redis,怎么用的?
  8. 手撕:反转字符串。
  9. 你熟悉哪些算法?知道哪些排序算法?
  10. 对广度优先搜索和深度优先搜索有了解吗?
  11. 手撕:LeetCode 200 岛屿数量。这属于什么算法?
  12. Java 的 final 有哪些用法?
  13. 有用过多线程吗?怎么用的?
  14. 项目中用过哪些设计模式?举例说明。
  15. 在 Java 中用过 Redis 吗?具体怎么配置?
  16. 用过 AI 编程吗?用过哪几个?
  17. 代码中怎么体现安全?
  18. 内存泄漏的原因,GC 的算法有哪些?

《参考解析》

内存结构按层次答:寄存器 → CPU 缓存 → 主存 → 磁盘;进程视角是代码段、数据段、堆、栈、共享库和内核空间。栈存局部变量和调用帧、由系统自动回收,堆存动态分配的对象、由 GC 或手动释放;堆和栈之间是共享区和内存映射区。能说到「栈溢出」和「堆碎片」分别对应什么现象就够用了。

Redis 缓存机制要讲清「为什么快」和「怎么用」:纯内存、单线程避免锁竞争、IO 多路复用、高效数据结构。用法上是旁路缓存:读先查 Redis,未命中回源数据库并回填;写先更数据库再删缓存。要配过期时间和淘汰策略,热点数据预热。

岛屿数量用 DFS/BFS 都行:遍历网格,遇到 ‘1’ 就把计数加一,然后从这个点开始把相连的 ‘1’ 全部标记为 ‘0’(或 visited),四个方向递归/入队。时间复杂度 O(mn),空间是递归栈或队列。它属于图遍历,本质是求连通分量个数。

Java 的 final 有三种用法:修饰变量表示不可重新赋值(引用不可变,对象内容仍可变)、修饰方法表示不能重写、修饰类表示不能被继承。它和不可变对象、线程安全有关系,但不等于「内容不可变」。

GC 算法:标记-清除(有碎片)、复制(新生代,空间换效率)、标记-整理(老年代,无碎片)、分代收集。内存泄漏常见原因是长生命周期集合持有对象、监听器未注销、ThreadLocal 未 remove、连接未关闭;排查用堆 dump + MAT 看支配树。

设计模式别背定义,讲你在项目里怎么用的:策略模式替换 if-else、工厂解耦创建、模板方法抽公共流程、责任链处理多级校验、单例管理全局配置。