ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

银行Java技术岗面经:交通银行与微众银行,从基础八股到分布式实战

银行Java技术岗面经:交通银行与微众银行,从基础八股到分布式实战 每年秋招春招最难熬的不是投简历而是面试。投出去几十份简历等来的面试机会就那么几个每一个都值得认真对待。我去年秋招的时候面了交通银行和微众银行两家都走到了终面最后拿了其中一家的offer。当时我把面试题和答案整理成了一份文档陆陆续续分享给几个学弟学妹反馈都说帮助很大。今天把这份面经完整整理出来题目和答案都做了补充希望能帮到正在准备银行系或者互联网银行面试的同学。这篇面经不是简单的题目罗列而是把每道题背后的考察点、我当时是怎么答的、哪些地方答得不好、后来复盘怎么补上都写清楚了。不管你是准备Java后端还是打算投银行的技术岗这份内容都有参考价值。交通银行是传统国有大行的风格微众银行是互联网银行的风格两家面试的侧重点差别挺大对比着看你就能明白不同公司到底想招什么样的人。1. 面试前的准备先搞清两家银行的定位很多同学准备面试喜欢一上来就刷八股文其实顺序反了。你得先搞清楚这家公司到底要什么样的人再决定怎么准备。交通银行和微众银行虽然都叫银行但技术面试的风格可以说是两个极端。1.1 交通银行的面试风格与考察重点交通银行作为国有大行技术面试的风格偏传统考察的内容非常基础基本围绕Java核心技术栈、数据库、计算机基础展开。面试官不太会问你用过什么特别新潮的框架反而会抓住一个知识点往深里问比如HashMap的扩容机制、JVM的内存模型、MySQL索引的底层结构这些。还有一个很明显的感受交通银行的面试流程相对固定一面和二面的内容区分度不大都是以技术基础为主。面试官的态度普遍比较温和与其说是考察你不如说是在确认你是否具备扎实的计算机功底。这种风格的好处是只要基础够硬答起来会比较有底气。1.2 微众银行的面试风格与考察重点微众银行虽然是银行牌照但本质上是一家互联网公司技术面试的风格跟大厂非常接近。一面就会上算法题而且是需要你在白板上写代码那种。考察的内容里分布式、高并发、缓存、消息队列这些占了很大比重还会深挖你项目里的技术难点问到你答不上来为止。我在微众的面试中明显感觉到面试官非常看重候选人解决实际问题的能力。同样的知识点他不会问你“Redis有哪些数据结构”而是会问“在高并发场景下你用Redis的哪种数据结构解决什么问题为什么选它”。这种问法光背八股文是过不了关的。1.3 我的准备策略我当时的时间安排是这样的前两周集中刷Java基础和数据库的八股文每个知识点都整理成自己的话术后两周刷LeetCode热题和复习项目。项目复盘是重中之重我把项目里每一个技术选型的原因、遇到的坑、最终效果都重新过了一遍确保面试官随便问哪个点都能展开说。准备面试有一个特别实用的方法就是对着镜子或者录音练习。你以为自己懂了说出来才发现逻辑是乱的。我当时把高频题的答案都写成稿子反复录音、回听、修改直到能流畅自然地讲出来。这个习惯帮我避免了很多“脑子懂了但嘴说不出来”的尴尬。2. 交通银行面经实录基础扎实比花活重要交通银行的面试整体氛围比较轻松一面和二面都是技术面但考察的深度差别不大。我遇到的面试官很友善答错了他还会引导你往正确的方向想。下面把还记得的题目和我的答题思路整理出来。2.1 一面核心八股题答案HashMap的底层实现、put流程和扩容机制。这道题几乎是必考题。我从JDK1.8的数组链表红黑树结构说起put时的hash计算key的hashCode高低16位异或、遇到哈希冲突时怎么挂链表、链表长度超过8且数组长度超过64时树化、扩容时为什么是2倍幂为了哈希均匀和位运算优化。答这道题的关键是要有层次先数据结构再流程再优化考虑面试官想听到的是你是否真的理解而不是背诵。JVM的内存区域划分和垃圾回收算法。我把堆、虚拟机栈、本地方法栈、方法区、程序计数器逐个说明重点讲了堆的分代新生代、老年代、Minor GC和Full GC的区别以及可达性分析算法里GC Roots包含哪些对象。面试官追问了CMS和G1的区别我答了CMS是标记-清除算法、会产生碎片、G1是Region划分、可预测停顿时间这些是JVM调优里最基本的常识。MySQL的索引底层为什么用B树。这道题我给出的核心思路是二叉搜索树会退化成链表AVL树旋转太频繁红黑树层高还是不够低B树虽然矮但非叶子节点也存数据导致单节点能存储的索引数量少B树非叶子节点只存索引、叶子节点形成有序链表更适合范围查询和磁盘预读。面试官对每个点都追问了“为什么”说明他真的想确认你是不是理解了这些数据结构的差异。Spring的IOC和AOP原理。IOC我讲了BeanFactory和ApplicationContext的关系、Bean的生命周期实例化、属性填充、初始化、销毁AOP讲了动态代理的两种方式JDK代理和CGLIB代理以及各自的适用条件。这里有个坑一定要说清楚“Spring中默认对实现了接口的类使用JDK代理对没实现接口的类使用CGLIB”很多同学只说代理模式没说清楚Spring具体怎么选的。事务的隔离级别和MVCC机制。四个隔离级别读未提交、读已提交、可重复读、串行化分别解决什么问题这一点要能倒背如流。MySQL默认是可重复读但也没有彻底解决幻读问题需要配合间隙锁。MVCC的机制我讲了三张隐式字段DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID、undo log版本链和ReadView的可见性判断规则。2.2 二面场景题与项目深挖二面的面试官明显级别更高问的问题更偏向场景和项目但还是没有离开基础知识的范畴。缓存穿透、缓存击穿、缓存雪崩如何解决。这道题我们项目里真实遇到过所以答得比较顺。穿透我回答的是布隆过滤器缓存空值击穿是热点key加互斥锁或逻辑过期雪崩是过期时间加随机值多级缓存服务降级。面试官追问了一个点布隆过滤器误判怎么办我回答可以定期重建布隆过滤器或者对误判的key做二次校验虽然追问很细但思路对了基本没问题。高并发下的订单超卖问题。这是一道经典的数据库题目。我给出的是乐观锁方案更新时加版本号或库存条件UPDATE ... WHERE stock 0如果影响行数为0则说明库存不足。面试官又问能不能用Redis扣减库存我说可以但要注意Redis和数据库的一致性用Lua脚本保证原子性。这道题的核心是让面试官看到你有明确的方案对比意识而不是只会背一种解法。介绍项目里最有挑战性的一个点。这个一定要提前准备不能现场想。我讲的是项目里的一个消息推送服务延迟高峰期会积压大量消息。我的方案是改成批量消费动态线程池的参数调整最终把消费吞吐提升了3倍。面试官的关注点在于问题是怎么发现的监控、方案是怎么验证的灰度、最后效果怎么量化QPS、延迟数据。你在准备项目时一定把这三个问题想清楚。2.3 交通银行的避坑心得交通银行的面试题目本身不算难但有一个容易忽略的点他们非常看重表达的条理性。同一个答案有人能拿高分有人只能及格差别就在表达方式。我的建议是回答任何技术问题都用“先说结论、再讲原理、最后举例子”的结构这能让面试官快速get到你的思路。还有一个小细节交通银行的一面和二面之间隔了挺久期间最好主动跟进一下状态表现你对这个岗位的诚意。我当时是二面结束后两周才收到的通知期间心态有一点点崩但事实证明只要面试发挥到位流程慢一点是正常的不用自己吓自己。3. 微众银行面经实录算法与项目深度是分水岭微众银行的面试强度明显上了一个台阶。一面就有两道手撕代码题二面对项目的追问非常深几乎每个技术点都要问到你“为什么这样选”。如果之前没经历过互联网风格的面试可能会有点不适应。3.1 一面算法题与Java基础算法题实现一个LRU缓存。这道题是LeetCode 146的原题我用HashMap双向链表实现的get和put都是O(1)复杂度。写完之后面试官问了一个问题为什么不用LinkedHashMap我说LinkedHashMap底层就是HashMap双向链表原理一样自己实现是为了展示对数据结构的掌握。这个回答让面试官比较满意。写算法题的时候一定要边说边写把自己的思路同步给面试官沉默着写完是最吃亏的。算法题给定一个数组找出其中第K大的数。我给出了两种解法快排partition法和堆法。面试官追问了时间复杂度和空间复杂度以及大数据量下比如10亿个数应该怎么处理。大数据量下堆法更优因为只需要维护一个大小为K的小顶堆空间复杂度是O(K)而快排partition需要把所有数加载到内存。能答出这个对比面试官才会认为你真的理解了。Java基础ConcurrentHashMap的实现原理。我讲了JDK1.8的CASsynchronized实现put时对node节点加锁相比JDK1.7的Segment分段锁粒度更细锁竞争更小。面试官追问了size()方法是怎么实现的我回答了通过baseCount和CounterCell数组来避免竞争必要时加锁。这道题属于Java并发编程的高频题一定要吃透。Java基础线程池的参数和拒绝策略。七大参数核心线程数、最大线程数、存活时间、时间单位、工作队列、线程工厂、拒绝策略必须背熟四种拒绝策略AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy要能解释清楚。面试官问了一个实战场景核心线程数是4最大线程数是8队列容量是100同时来了200个任务会发生什么我当时有点紧张算错了后来复盘才发现第105个任务开始才会触发拒绝策略。3.2 二面分布式与项目难点二面的面试官是技术主管全程没有问八股文全部围绕项目和他的技术栈展开。分布式锁的场景和实现方式。我们项目里有一个库存扣减的场景为了保证多实例下不超卖我用过Redis的SETNX实现分布式锁后来发现锁可能过期导致业务还没执行完锁就被释放了改成Redisson的看门狗机制自动续期。面试官继续追问如果Redis主节点宕机锁丢失怎么办我说可以用RedLock但面试官明显对这个方案有保留意见后来我了解到RedLock本身在业界就有争议这种情况下最好的回答是承认这个方案的局限性然后说明自己做过哪些权衡。RocketMQ和Kafka的选型对比。我说项目里用的是RocketMQ因为公司技术栈本身偏向阿里系。面试官问如果让你重新选你会怎么选我的回答是如果对消息顺序和事务消息有强要求选RocketMQ如果追求超高吞吐量选Kafka两者在功能上有重叠但适合的场景不同。这种开放性的问题面试官想听的是你的判断依据而不是标准答案。设计一个秒杀系统。这是一个经典的架构设计题。我从四个方面展开流量控制通过验证码、答题、CDN静态化来降低请求量、库存扣减Redis预扣减Lua保证原子性异步同步数据库、防刷同一个用户限购、IP限流、降级超过阈值直接返回失败。面试官在每个环节都追问了细节尤其是Redis和数据库的一致性说明他非常关心方案能不能落地。3.3 微众银行的避坑心得微众银行的面试最大的坑就是算法题。如果你平时刷题量不够一面的两道题可能就会卡住。我的经验是高频题LRU、TopK、反转链表、最长回文子串、三数之和一定要刷到滚瓜烂熟能默写的程度。面试的时候不要纠结最优解先给出一个可运行的暴力解再和面试官讨论优化这样至少不会零分。另外一个心得是微众的面试官很吃“业务理解”这一套。同样一道分布式锁的题你只说技术方案和你说“我们业务场景里商品库存只有几千个并发量不算极端所以用Redis就够了不需要引入ZooKeeper”面试官的反应是完全不一样的。让面试官看到你有结合业务做技术决策的意识这是互联网风格面试的核心。4. 两家银行面经答案里的通用考点清单面完这两家银行之后我把所有的题目做了个归类发现高频考点其实是趋同的。不管面试官换什么问法核心知识点就那么几个。下面整理一个速查表对着这个表复习效率会高很多。4.1 高频八股题速查表考点核心要点常见问法HashMap数组链表红黑树扩容2倍幂线程不安全底层结构、put流程、为什么用红黑树ConcurrentHashMapCASsynchronized锁粒度细化和Hashtable的区别、size()实现JVM内存堆、栈、方法区、程序计数器内存区域划分、哪些是线程共享GC算法标记-清除、标记-复制、标记-整理CMS和G1的区别、如何选择垃圾收集器MySQL索引B树、聚簇索引、回表为什么用B树、索引失效场景事务隔离四种隔离级别、MVCC、间隙锁可重复读解决了什么、幻读怎么处理Redis数据结构、持久化、缓存雪崩/穿透/击穿缓存一致性怎么保证消息队列选型对比、消费幂等、顺序消费怎么保证消息不丢失SpringIOC、AOP、Bean生命周期循环依赖怎么解决分布式CAP理论、分布式锁、BASE分布式事务有哪些方案这张表覆盖了80%以上的面试题前提是你真能把这些点展开讲清楚而不是看一眼觉得“哦我知道”就过了。我吃了很多亏才明白能写出来、能讲出来才是真的会。4.2 场景题的答题框架除了八股题面试里最怕的就是场景题题干通常很短比如“如果让你设计一个X系统你怎么做”。这类题没有标准答案但有一个通用的答题框架。先说业务目标把这个系统要解决的核心问题讲清楚比如秒杀系统就是要“在极高并发下还能正常卖货”再画一个整体架构从接入层到应用层到数据层逐层说明每个环节用什么组件、为什么这么选然后说关键难点高并发下的数据一致性怎么保证、热点数据怎么处理、系统挂了怎么降级最后说权衡与取舍比如你说用Redis做库存扣减就要承认Redis宕机的风险并提出补偿方案。这个框架最大的好处是不会冷场。就算你对某个系统不熟悉按照“业务目标、架构、难点、取舍”的顺序也能说出一些有内容的话比憋半天说一句“我不会”强得多。平时可以拿“设计一个短链系统”“设计一个扫码登录”“设计一个延迟消息队列”来练手每个题练两遍面试时遇到场景题就不慌了。5. 复盘面完这两家银行我总结的经验面了这么多轮最大的感受是面试不只是公司在挑你也是你在判断这家公司适不适合自己。交通银行的面试让我觉得踏实微众银行的面试让我觉得刺激但都让我更清楚自己的定位。下面是几个我认为最核心的经验。5.1 面试官到底想看什么面试官每天面那么多人记住一个人很难。能让他写下“通过”两个字的往往是这个候选人有某一个点特别突出。要么是某个项目讲得让人印象深刻要么是一道算法题给出了漂亮的优化要么是对某个技术有超出简历本身的深度理解。所以不要试图在45分钟里面面俱到那样反而显得没有重点。选一个你最擅长的方向不管是JVM、Redis还是消息队列往深了准备准备到面试官问什么都能接住。面试官一旦在一个方向上确认了你的深度就会默认你在其他方向也有类似的潜力这就是“一超带动多强”。5.2 关于答案的灵活表达同一个知识点背出来的答案和讲出来的答案面试官一听就能分辨。我第一次模拟面试的时候被朋友指出“像在背课文”后来我才意识到背答案是因为我并没有真正理解。调整的方法是每次复习一个知识点都先用自己的话复述一遍然后试着给一个完全不懂技术的人讲一遍如果他能听懂说明你是真的理解了。还有一个很实用的技巧在回答的时候多用“我当时是这么想的”“这里有个坑是”“后来我踩过一次”这类带个人经历的表述。面试本质上是一次交流不是考试你讲得越自然面试官就越放松也越愿意给你机会。5.3 一些小建议简历上写的每一个项目都要准备好被深挖。写“使用了Redis”就要能回答“为什么用Redis而不是本地缓存”写“解决了千级QPS”就要能解释清楚这个数字怎么来的。经不起追问的简历内容就是给自己埋雷。面试前的那个晚上不要再刷题了。我当时是把高频题的答案录成音频睡前听一遍效果比看文档好很多。面试当天提前20分钟到整理一下状态。遇到不会的题先冷静30秒把题目复述一遍给自己争取思考时间就算答不全也要让面试官看到你的思考过程。最后再分享一个我踩过的坑面完试一定要记录复盘。我当时专门建了一个文档每面完一场就把题目回忆出来标注哪些答得好、哪些需要补课。这份文档在后续几场面试中帮了大忙因为它让我清楚地知道自己的薄弱点在哪里也知道自己的优势在哪里。面经的意义不是让你背题而是让你提前见过足够多的场景真正上场的时候不慌。希望这份面经能帮到正在准备面试的你。
返回列表