招银云创 一面面经:Agent 客户端开发的银行系基础与安全追问
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
数据结构与算法(手写代码 + 口述原理)
- 栈和队列的区别,如何用两个栈模拟一个队列?
- 删除单向链表倒数第 N 个节点(快慢指针思路)
- 冒泡排序原理,手写实现;完全逆序输入的时候,提前退出优化为什么失效?
Redis
- Redis 的使用场景
- 缓存雪崩、缓存击穿、缓存穿透的概念和解决方案
MySQL 数据库
- 事务介绍以及 ACID 四大特性
- MySQL 索引创建原则
- 单库容量大于 100G,数据库优化方案
设计模式
- 常用设计模式以及对应的使用场景
- 手写单例模式(DCL 双重校验锁)
JVM(银行高频)
- JVM 内存泄漏完整排查流程
- Java 会造成内存泄漏的常见场景
Java 多线程
- Java 线程池相关类有哪些?
- ThreadPoolExecutor 七大参数、四种拒绝策略,阿里规范为什么不推荐直接使用 Executors?
计算机网络与安全(Agent 岗位重点考察)
- HTTP 和 HTTPS 的区别,从业务保障角度讲 HTTPS 的安全能力
- 对称加密、非对称加密的适用场景以及常见算法
- Base64 是不是加密算法?
- 中间人攻击如何防范?
开放性项目问题
- 求职意向写的是 Java 开发,本次岗位是 Agent 客户端开发,怎么选择?
《参考解析》
-
两道手写题:两个栈模拟队列、删除链表倒数第 N 个节点:队列题入队永远压 in 栈,出队时若 out 栈为空就把 in 栈全部倒入 out 栈再弹出,均摊 O(1),关键是「只在 out 空的时候倒」,否则复杂度分析说不圆;追问多半反过来考两个队列模拟栈。链表题用哑结点加双指针,快指针先走 N+1 步再一起走到尾,慢指针正好落在待删节点的前驱;边界要主动说清——删除头节点、N 等于链表长度、N 非法,有哑结点就不会写崩。
-
冒泡排序的提前退出为什么在完全逆序时失效:提前退出靠「某一轮没有任何交换」判断已经有序。完全逆序时每一轮都在交换,直到最后一趟才可能不交换,所以一次都提前不了,比较次数仍是 n(n-1)/2。这题在考你对优化条件成立前提的理解,别只说「优化没生效」。
-
缓存三大问题分开答:穿透是查不存在的数据反复打库,用空值缓存、布隆过滤器或参数校验挡掉;击穿是热点 key 过期瞬间大量请求打库,用互斥重建、逻辑过期或热点不过期;雪崩是大量 key 同时失效或缓存整体不可用,靠过期时间打散、多级缓存、熔断限流与集群高可用兜底。
-
单库超过 100G 先别急着分库分表:先看能不能瘦身——归档冷数据、清理冗余索引、把日志和大字段拆到独立表;再考虑读写分离、分区表、垂直拆分,最后才是水平分库分表与分片键选择。顺带补一句慢 SQL 治理与缓存,这套顺序比直接答「分库分表」成熟得多。
-
DCL 单例为什么必须加 volatile:因为实例化是「分配内存、初始化对象、把引用指向内存」三步,编译器和 CPU 可能重排,别的线程会拿到引用已赋值、对象却还没初始化完的半成品。volatile 禁止这种重排,外层判空避免每次加锁,内层判空防止重复创建——两次判空各自解决什么,要能说清。
-
JVM 内存泄漏排查流程:先看现象(GC 频繁、老年代持续上涨、Full GC 后不回落),再抓现场(jmap 或 jcmd 导出堆转储),用 MAT 一类工具看支配树和 GC Roots 引用链定位持有者,改完回归验证。常见场景要能报出几个:静态集合只增不减、监听器与回调未注销、ThreadLocal 用完没 remove、连接流未关闭、内部类或匿名类持有外部对象引用。
-
线程池题的重头是参数与 Executors 规范:七大参数依次是核心线程数、最大线程数、空闲存活时间、时间单位、工作队列、线程工厂、拒绝策略;四种拒绝策略是抛异常、调用者线程执行、直接丢弃、丢弃最老的任务。阿里规范不推荐 Executors,是因为 newFixedThreadPool 和 single 用无界队列可能 OOM,newCachedThreadPool 的最大线程数是整数上限、会无限建线程,所以应该手动 new ThreadPoolExecutor 把参数显式定下来。
-
HTTPS 与加密这组题串起来答:HTTPS 是 HTTP 加 TLS,解决明文传输、篡改和冒充三个问题;非对称加密用于密钥交换和数字签名,对称加密用于数据加密(因为快),证书链校验把服务端身份绑到公钥上。Base64 只是编码不是加密,它不提供任何机密性。中间人攻击的防范靠校验证书链与域名、信任系统 CA、启用 HSTS,而不是在客户端忽略证书错误。