
1. 面试流程与试题概览1.1 爱奇艺Java校招整体流程2018年秋季爱奇艺校招Java工程师岗位整体节奏是网申、在线笔试、技术面试两到三轮、HR面。第三场面试一般不是第一轮很多同学是笔试通过后先做了一轮技术电话面或视频面再进入现场面。第三场的考察重心明显和初面不一样——初面喜欢问“你知道什么”问得广第三场更偏“你怎么解决问题的”问得深而且会现场让你写代码把你逼到墙角看你怎么反应。爱奇艺当时的业务线包括在线视频、爱奇艺智能、游戏等Java技术在服务端承担了大量重流量业务。所以面试官出题非常务实不爱问那种背了八股文就能答的题而是喜欢把几个知识点串起来比如问HashMap的时候顺带让你算扩容后的下标再问你Java 8的ConcurrentHashMap读操作为什么不加锁。这些都是我后来复盘整个面试时体会比较深的地方——现在看起来那场面试的问题放在今天依然很有参考价值因为Java基本功和并发、JVM、数据库这些底层逻辑没有过时反而越来越重要。1.2 第三场实际考查的知识点分布我根据当时同批次同学的面经和网上零散的信息做了整理第三场Java工程师的常见考点大致分为六类Java基础、集合框架、并发编程、JVM、Spring与数据库、算法与场景设计。其中面试官最看重的是集合与并发因为这两块最考验一个候选人是否真的读过源码、理解过底层而不是只看过面经。下面是典型的知识点分布对照表。考察方向典型题目难度面试官考察意图Java基础String、Integer缓存、equals/hashCode基础验证语言功底是否扎实集合框架HashMap底层、ConcurrentHashMap核心验证源码阅读能力并发编程volatile、Synchronized、线程池参数核心验证多线程实战经验JVM内存区域、GC、类加载进阶验证线上问题排查意识框架与数据库Spring IOC、MySQL索引、事务隔离进阶验证业务开发综合能力算法与场景反转链表、快排、短链设计区分度验证代码能力与系统思维如果你正在准备Java校招可以拿这份表对照自己的短板。不要只盯着题目本身要追问“为什么这么考”。面试官每个问题背后都在验证一件事你是不是一个在真实项目中解决问题的人还是只会背答案的人。2. Java核心基础高频必考题深入剖析2.1 String、包装类与常量池爱奇艺第三场的Java基础题里String几乎是必问的。常见开场是“String s new String(abc)创建了几个对象”这不是让你蒙答案而是考察你知不知道字符串常量池、堆、栈之间的关系。我当时回答的是如果常量池里已经有了abc那么只创建一个堆中的String对象如果常量池里没有则会在堆中创建对象的同时在常量池中创建或复用abc所以可能是一个或两个对象。这道题真正的加分点是你要主动补充在JDK 7之后字符串常量池被放到了堆里所以常量池中的对象是普通的堆对象位置不同、但回收规则不再像永久代那么苛刻。再往下面试官必然会追问String为什么设计成不可变。这个问题我建议从三个维度答一是安全String被大量用作HashMap的key和网络参数不可变避免hash值变化二是线程安全不可变对象天然并发安全不需要同步三是常量池复用如果可变了池里对象的引用就全乱了。为了更有说服力你可以补一句JDK 9把String底层从char[]改成了byte[]目的是节省空间尤其对拉丁字符场景能省一半内存。除了String包装类的Integer缓存也属于高频考点。面试官会问“Integer a 127Integer b 127a b是true还是false那如果是128呢”这题的原理是IntegerCache默认缓存了-128到127之间的对象。在这区间时自动装箱直接返回缓存对象超过这个区间则new新对象所以128那组用比较得到的是false。这里建议你顺手补充缓存上限可以通过JVM参数-XX:AutoBoxCacheMax调整但是默认-128到127是写死的而且这个机制在Long里也有只是不能调。2.2 equals与hashCode的约定“重写equals必须重写hashCode吗不重写会怎样”这是爱奇艺这种重视业务落地能力的公司特别喜欢问的一道题。它考察的是你有没有真正用HashMap存过自定义对象而不是只背过《Effective Java》第11条。我给你的回答思路是equals用于判断逻辑相等hashCode用于快速定位存储桶。一个对象放进HashSet时先计算hashCode定位到桶再用equals和桶内元素逐个比较。如果两个对象通过equals判断相等但hashCode不同它们会被分到不同桶里在HashMap中就出现“两个相等的key同时存在”的乱象理论上破坏了Map的key唯一性。反过来hashCode相同但equals不等是可以的这就是哈希冲突。HashMap解决冲突用的是链表加红黑树。这里要提醒你实际操作中的坑如果业务上两个对象只要id相等就意味着是同一条记录那equals和hashCode都应该基于id实现而不能用默认的Object地址比较。用IDE生成的equals/hashCode模板是安全的但如果你手动写务必保证 equals 相等的对象 hashCode 一定相等。我在面试里见过有候选人答得上“要重写”但是追问“什么场景下会出问题”就卡壳了所以面试前一定要自己想一个真实场景去讲。2.3 面向对象与设计原则接口与抽象类的选择第三场笔试和面试都绕不开面向对象最常见的是“什么时候用接口什么时候用抽象类”。这个问题的核心不是背定义而是理解设计意图。接口是对行为的抽象强调的是“能做什么”抽象类是对族系抽象强调的是“是什么”。Java 8之后接口可以有default方法两者的边界有些模糊但本质上接口适合定义能力标准和多继承抽象类适合抽取公共状态和代码实现。答这道题时我建议你主动结合爱奇艺的业务场景举例比如视频内容有多种类型电影、电视剧、综艺、动漫。你可以定义一个Media接口声明play()、pause()、getDetail()等方法也可以定义一个AbstractVideo抽象类把公共字段标题、封面、播放地址和公共方法比如统一的参数校验放在里面再让各个具体视频类型继承它。这种回答方式远比空洞背概念好因为面试官能从中看出你有抽象设计能力而不是只会用IDE写CRUD。另外面试官还可能顺着问设计原则比如“开闭原则”“里氏替换原则”。这些不是虚的写业务代码时很关键。比如策略模式就是典型的开闭——加一种新的支付方式不需要改原有逻辑只需要新增一个实现类。爱奇艺这种体量的系统最怕的就是改一处代码影响一片所以面试官一定会看你对“低耦合、高内聚”有没有真正的体感。3. 集合与并发最容易被问出深度的两大块3.1 HashMap实现原理全解析HashMap是Java面试的“题眼”也是爱奇艺第三场面试里出现概率接近100%的考点。面试官通常从“HashMap的底层结构”开始一路追问到put流程、扩容过程、红黑树的引入原因以及JDK 7和JDK 8的差异。你脑子里要有一张完整的图JDK 8的HashMap底层是数组加链表加红黑树。put一个key时先根据key的hashCode做一次扰动运算即hashCode高16位异或低16位然后用(n - 1) hash计算桶下标。如果桶中为空直接插入如果有节点用equals比较key相同则覆盖不同则尾插到链表当链表长度达到8且数组长度达到64时链表转红黑树。扩容时数组长度变为原来的两倍节点要么留在原索引要么移动到“原索引加oldCap”的位置。关于“为什么用异或而不是直接取模”我建议你解释到这一层hashCode往往是低位分布不均的尤其当数组长度较小时直接用hash (n - 1)会丢弃高位信息增加冲突。异或操作把高位特征“混入”低位让散列更均匀。而用(n - 1) hash代替hash % n是因为当n是2的幂时二者结果等价的但位运算更快。扩容时为什么要么原位、要么原索引加oldCap是因为扩容后cap多了一位二进制1key的hash在这位上是0还是1决定了新的桶位置。面试官如果让你“手写一个简单HashMap”不要慌核心逻辑就是数组加链表put时算下标、处理冲突get时按key查找。现场不需要写红黑树但你要把基本骨架写出来并表现出你理解边界条件——比如key为null时JDK 8会放在table[0]上。3.2 ConcurrentHashMap如何保证线程安全HashMap在并发下会出现CPU打满、死循环、数据丢失的问题所以面试官会接着问ConcurrentHashMap。如果你没读过源码这里很容易临场翻车我强烈建议你把JDK 8的ConcurrentHashMap完整读一遍再上考场。JDK 8的ConcurrentHashMap放弃了JDK 7的分段锁设计桶数组使用volatile修饰保证可见性。put时如果桶位为空用CAS直接插入不需要加锁如果桶位不为空则对桶的首节点加synchronized锁锁粒度细化到单个桶。这样在高并发写入时不同桶之间互不干扰。扩容时支持多线程协助迁移通过ForwardingNode标记已迁移的桶。读操作则完全不加锁因为Node的val和next都是volatile可以保证读到的数据不是过期的。注意size()方法也不是精确的它通过累加baseCount和CounterCell数组来估计在高并发下允许轻微误差。这道题特别容易答错的地方是“ConcurrentHashMap的size()精确吗”答案是不精确。很多人惯性以为它和HashTable一样是强一致性的其实它追求的是高并发下的弱一致性。爱奇艺这种视频网站每天有海量播放行为上报很多计数场景允许短暂不一致最终一致就好。面试官问这个就是在看你有没有处理过高并发数据的经验。3.3 volatile与JMM从可见性到双重检查锁并发三特性是校招必考原子性、可见性、有序性。volatile能保证可见性和有序性但不能保证原子性。面试官会问volatile为什么可以保证可见性这要讲到JMM的“工作内存与主内存”模型每个线程有独立的工作内存操作变量时先拷贝到工作内存写回时机不确定volatile变量在写时会产生Lock前缀指令强制把修改写回主内存并使其他线程工作内存里对应的缓存行失效从而保证后续读能拿到最新值。双重检查锁单例是我认为最容易在面试中体现水平的题。代码本身很简单但你要把每一行都讲清楚第一次判空是避免不必要的同步加锁保证只有一个线程能进入创建流程第二次判空是防止多个线程都通过第一次检查后排队进入避免重复创建变量上必须加volatile否则在“分配内存、初始化对象、把引用指向内存”这三步中指令可能重排为“先指向内存、再初始化对象”。这样另一个线程拿到的是半初始化对象。JIT和CPU是允许这种重排的而volatile禁止指令重排这就是加它的原因。我在实际面试中针对volatile还遇到过两个追问“volatile能保证i的原子性吗”和“能不能用volatile替代synchronized”答案都是不能。i是读改写三步volatile管不了synchronized能同时保证原子性、可见性和有序性使用场景更广但代价是重量级。只有明确读多写少且不依赖旧值计算的场景才适合用volatile比如状态标志位。3.4 线程池的核心参数与拒绝策略线程池是爱奇艺面试里和HashMap并列的高频考点而且面试官特别喜欢结合业务问“如果有一个任务队列来任务就丢线程池你们怎么配”这题答得好不好直接体现你有没有真实经历过生产环境。线程池有七个核心参数corePoolSize核心线程数、maximumPoolSize最大线程数、keepAliveTime非核心线程空闲存活时间、unit、workQueue任务队列、threadFactory、handler拒绝策略。执行流程是当提交任务时如果线程数小于核心线程数直接创建新线程执行如果核心线程已满且队列没满任务入队如果队列也满了尝试创建新线程直到达到maximumPoolSize如果还不能执行走拒绝策略。记不住这个流程的人我建议你想一个饭店的比喻核心线程是固定厨师队列是排队区域最大线程是临时叫来帮忙的厨师拒绝策略就是把客人劝走或记录下来说稍后通知。拒绝策略有四种AbortPolicy直接抛异常、CallerRunsPolicy在提交任务的线程里运行、DiscardPolicy静默丢弃、DiscardOldestPolicy丢弃队首任务把新任务入队。具体选哪个要根据业务。如果任务丢了也无所谓可以用DiscardPolicy如果任务必须被处理且允许反馈速度变慢用CallerRunsPolicy更好默认的AbortPolicy在频繁任务量突增时容易误伤正常请求所以我个人在业务系统里更倾向自定义拒绝策略把无法立刻处理的任务持久化到本地或消息队列稍后重试。4. JVM、框架与数据库综合能力考察4.1 JVM内存区域与OOM排查思路爱奇艺这种大流量平台对线上容量非常敏感所以面试官会认真考察JVM。第一问通常是“JVM运行时数据区有哪些哪些线程共享哪些线程私有”回答框架线程私有的有虚拟机栈、本地方法栈、程序计数器线程共享的有堆、方法区JDK 8之后是元空间和直接内存。栈里存栈帧每个方法调用就是一个栈帧入栈出栈栈帧里有局部变量表、操作数栈、动态链接、方法出口。堆里存绝大多数对象实例是GC的主要区域。这道题的原理解析重点在“为什么这样划分”。程序计数器记录字节码执行位置线程切换后依赖它恢复虚拟机栈描述Java方法的执行过程本地方法栈服务native方法。堆作为对象分配的共享大区域GC压力最大。方法区存类元信息、常量、静态变量JDK 8用元空间替代永久代就是因为永久代大小固定且容易OOM而元空间使用本地内存触发条件更宽松。面试官还可能现场考一个问题“线上出现OOM你会怎么排查”我建议的回答路径是先看日志里的异常类型——是Java heap space、Metaspace还是Unable to create new native thread再根据类型用jmap或jcmd导出堆快照用MAT或VisualVM分析看对象占用排行结合业务代码判断是否存在内存泄漏比如大List没清空、静态Map缓存无限扩张、连接或IO流未关闭。如果你在项目中真处理过类似问题可以把当时的排查命令和现象讲出来比如看到“java.lang.OutOfMemoryError: Java heap space”后用jmap -dump:formatb,file/tmp/heap.hprof pid导出快照再在MAT里发现有大量重复对象最后定位到某缓存没有设置过期。这种真实案例比背一百个理论都有用。GC相关的问题也常考比如“如何判断对象可以被回收”。可回收判断有两种引用计数法和可达性分析。JVM用的是可达性分析从GC Roots出发向下搜索。GC Roots包括栈帧中的本地变量、静态变量、JNI引用等。常用回收算法有标记-清除、复制、标记-整理新生代用复制算法老年代用标记-整理或标记-清除。为什么新生代适合复制因为新生代对象98%以上“朝生夕灭”复制代价低。为什么老年代用标记-整理因为老年代对象存活率很高复制算法需要额外空间分配担保代价太高。回答时能把这些细节串起来面试官才会觉得你是真的理解内存管理的演进逻辑。4.2 类加载过程与双亲委派机制类加载也是考察Java深度的重要问题。面试官会问“一个类从被加载到能使用经历了哪些阶段”标准答案是加载、验证、准备、解析、初始化。加载阶段通过类的全限定名获取二进制字节流并在内存中生成Class对象验证阶段检查字节流是否符合JVM规范防止恶意代码准备阶段为静态变量分配内存并设置默认值比如int是0引用类型是null解析阶段将符号引用替换为直接引用初始化阶段执行类构造器和静态代码块赋值。继续追问通常是“为什么要双亲委派”我建议用安全角度回答避免核心类库被篡改。每次类加载请求先交给父加载器父加载器处理不了再由子加载器自己加载。这样java.lang.String始终由启动类加载器加载不会被自定义加载器替换。爱奇艺这种高安全要求的平台面试官对这一点会比较敏感所以你最好能举出反例如果打破双亲委派会发生什么典型的场景是Tomcat的WebAppClassLoader为了各Web应用类隔离它先尝试自己加载类再交给父加载器——面试里能提到这一点会非常加分因为这证明你不仅会背机制还知道真实框架怎么处理特殊情况。4.3 Spring IOC与AOP原理Spring几乎是Java后端岗位必问的框架。第三场面试很可能直接问“Spring IOC容器是怎么工作的”你要分两层答BeanFactory是基础容器ApplicationContext是更强大的容器。启动时根据配置类或XML定义扫描指定包下的类把符合条件的类实例化并放入容器。这个过程包括扫描、解析Bean定义、实例化、设置属性、执行BeanPostProcessor、初始化、使用、销毁。我在回答时一定会提到循环依赖问题因为这是体现功力的关键点。Spring通过三级缓存解决单例Bean的循环依赖一级缓存存成品对象二级缓存存半成品对象三级缓存存ObjectFactory能生成早期对象的工厂。当A依赖B、B依赖A时创建A发现需要B就把A的ObjectFactory放入三级缓存然后去创建BB创建时发现自己依赖A就通过A的ObjectFactory拿到早期对象注入完成。注意构造器注入的循环依赖是解决不了的因为对象还没创建出来。AOP的考察点更直接“Spring AOP是怎么实现的”基于动态代理。如果目标类实现了接口默认用JDK动态代理如果没有接口用CGLIB生成子类代理。框架会通过拦截器链表把切面方法织入。面试官往往还会追问“和AspectJ有什么关系”——Spring AOP是运行期代理AspectJ是编译期织入两者原理不同。答到这里再结合爱奇艺的实际场景比如日志切面、分布式锁切面、接口耗时统计切面会让你显得更贴合业务。事务是Spring家族的另一个重点“事务传播行为”我必须提醒你用心准备。比如REQUIRED是默认行为如果当前存在事务则加入不存在就新建REQUIRES_NEW是挂起当前事务新开一个。生产环境中最常见的坑是方法A加了Transactional调用同类中的方法BB的传播行为不生效因为Spring事务基于代理实现同类内部调用不走代理。很多人线上遇到“明明加了事务却回滚不了”就是卡在这里。如果你能把这个案例分析给面试官听这一题基本稳了。4.4 MySQL索引与事务隔离级别数据库部分爱奇艺面试官偏爱索引和事务。索引题首先问“MySQL InnoDB引擎的索引底层是什么数据结构为什么用B树而不是B树或二叉树”答案核心是B树内节点不存数据只存key因此同样大小的页能容纳更多key树的高度更低磁盘IO次数更少B树的叶子节点有链表连接非常适合范围查询。而二叉树在数据量大时高度过高B树的非叶子节点也存数据导致单页放不下多少key。需要进一步掌握的是聚簇索引和非聚簇索引的区别。InnoDB的主键索引是聚簇索引叶子节点直接存整行数据二级索引的叶子节点存主键值所以要查非索引列数据时需要回表。面试官为了验证理解深度经常会问“回表是什么意思如何避免回表”答案就是覆盖索引——比如你查询的列刚好都在二级索引里就不需要回表。如果面试官追问联合索引你要答出最左前缀原则并且能说出为什么最左前缀成立B树对联合索引排序时是先按第一个字段排的跳过了第一个字段直接定位第二个字段索引就失效了。接着是事务隔离级别InnoDB默认是REPEATABLE READ。四个级别分别是读未提交Read Uncommitted、读已提交Read Committed、可重复读Repeatable Read、串行化Serializable。隔离级别解决的问题包括脏读、不可重复读、幻读。可重复读通过MVCC和间隙锁解决幻读。MVCC利用隐藏字段事务ID、回滚指针和undo log实现多版本并发控制读操作是快照读不加锁。这里我建议你多花心思理解快照读和当前读的区别select是快照读不加锁select ... for update和update/insert/delete是当前读需要加锁。面试官通常喜欢追一句“RR级别下幻读能完全解决吗”答案是“在快照读下解决在当前读下可以通过间隙锁和临键锁防止”这个细节能帮你和普通应聘者拉开差距。5. 算法与场景题区分度最大的环节5.1 手写算法高频题目与解题模板校招面试的手撕代码环节爱奇艺第三场的算法题难度中等偏基础但很看代码风格比如变量命名、边界处理、是否写注释。常见题目集中在链表、二叉树、排序、二分、TopK上。链表题最经典的是“反转链表”。这道题考察的是基础指针操作和熟练度模板写法是迭代法用pre、cur、next三个指针每次把cur.next指向pre然后整体后移。我给你的建议是先写核心框架并且要能在纸上边写边解释每行代码的意义。写完后自己用“特殊情况”检查比如链表为空或只有一个节点代码是否成立。排序里最常被要求手写的是快排。快排的核心是partition选一个基准值把数组分为小于基准和大于等于基准两部分再递归处理左右区间。写快排时最容易出错的就是边界条件比如左右指针相遇的标准是什么严格大于和等于的场景怎么处理。我建议你掌握一个自己最顺手的版本反复写熟练不要临场去回忆多个版本。二分的模板也很重要重点是while条件里用left right还是区间如何收缩这属于一个细节就能定生死的问题。TopK问题是另一个高频比如“从10亿个数中找出最大的100个”。如果数据量小到能装进内存可以直接用小顶堆堆顶始终是当前最小的元素当堆不满时直接加入堆满后发现新元素大于堆顶就把堆顶弹出、加入新元素。如果数据量太大无法完全加载用分治或位图。面试官更想看到的是你分析数据规模和内存的能力而不是一上来就背答案。从实操角度我强烈建议你准备一个“算法自测清单”在牛客网或LeetCode上按以下列表练习反转链表、链表中环的检测、合并两个有序链表、二叉树的前序/中序/后序遍历、层序遍历、最大深度、快排、归并排序、二分查找、两数之和、三数之和、最长回文子串、无重复字符的最长子串、数组中的第K个最大元素。每一道题都练到“闭着眼睛能写解释思路”的程度这比抱着面经背题库有用得多因为面试官经常会给你换一个边界条件看你举一反三的能力比如“如果数组中有重复元素怎么办”。5.2 场景设计如何设计一个短链服务爱奇艺第三场面试里有一个类似短链服务的系统设计题这类题不要求你设计出完整的微服务体系而是考察你是否有清晰的架构思维。我当时遇到的变体是“如何设计一个URL短链生成器”。这道题的核心难点有三个短码怎么生成、如何保证无冲突、如何支撑高并发读取。短码生成有几种主流方案。第一种是哈希截取比如用MD5或MurmurHash再截取前8个字符但可能出现冲突需要查表重试第二种是发号器利用数据库自增ID或Redis自增再把ID转换成一个62进制字符串数字、大小写字母共62个字符比如ID是2374转换成字符就是“Yx”。这种方法生成的短码天然无冲突适合主流方案。存储与读取就简单了短码到长链接的映射表建一个索引Redis缓存热点数据命中率高的短链直接走Redis不命中的再回源数据库。因为短链的访问存在明显的热点效应所以加一层缓存非常有必要。如果还有防刷需求可以记录请求IP或者加简单的限流策略。回答这种题的关键是先定技术选型方案再讲数据模型最后讲高并发处理一步一步像在真实设计一样。我还想补充一点场景题不一定要求你设计完整系统有时候面试官会把问题抛得很小比如“如果让你优化一次查询你会怎么下手”。这时候你要展现的是排查思路先看SQL执行计划、是否走索引、表数据量、有没有慢查询日志、业务上能不能做缓存。校招面试官要的是思路清晰而不是你给出一个一步到位的完美方案这一点非常关键。6. 面试复盘常见失分点与避坑建议6.1 面试中的经典踩坑实录我复盘大量面试后发现Java校招候选人最常犯的错误并不是“不会”而是“会但不准确”以及“表达没有结构”。比如问HashMap线程安全问题时有人直接说“用ConcurrentHashMap”但你要能解释它为什么安全、锁粒度多大、和HashTable比好在哪。只给结论不给过程等于把展示自己的机会扔掉了。第二个比较大的坑是“背概念”式的回答。比如问到Spring IOC候选人背一句“IOC就是控制反转把对象的创建交给容器管理”然后就停了。面试官想听的是容器怎么扫描的、Bean的生命周期有哪些、循环依赖怎么解决的、和DI有什么关系。回答技术问题时我建议你用“是什么—为什么—怎么做—有什么坑”的四层结构层层推进。第三个坑是代码能力和表达能力脱节。有的同学能在IDE里写代码但面试时手写代码就会出现变量命名随意、边界条件缺失、写完后不主动检查的情况。写完后我会习惯性做一次“代码走查”if分支是否覆盖空值、循环能不能退出、边界输入会怎样。面试官也的确会观察你是否做这一步因为它代表你在真实开发中的代码质量意识。6.2 考前准备清单从基础到项目的完整冲刺如果你的目标就是打一场高质量的Java校招面试我个人建议按时间线安排准备。面试准备不建议拉得太长三到四周是合理的周期。第一周主攻Java基础和集合源码以《Java核心技术卷》和源码为主把HashMap、ConcurrentHashMap、ArrayList、LinkedList的底层和适用场景全部过一遍第二周主攻并发、JVM和Spring配合实际调试和实验比如自己写一个多线程程序观察线程池的行为第三周主攻MySQL、Redis、算法以及系统设计的常见套路第四周集中做模拟面试和复盘。考前最后几天请把简历里写的每个项目都过一遍“项目六问”这个项目解决什么问题你负责哪部分技术选型为什么这样选遇到过什么难点怎么解决的如果重做会有什么优化我见过太多候选人项目经验写得漂亮但一被追问就含糊其辞这在爱奇艺这种注重工程能力的公司面试中特别吃亏。另外HR面也不要掉以轻心回答问题要真诚、稳定不要刻意贬低前一家公司或学校语言中要体现出对技术岗位和团队氛围的真实期待。最后再分享一个小技巧面试时回答任何技术问题尽量采用“定义先行、场景说明、价值收尾”的顺序。定义让面试官知道你懂是什么场景说明让面试官知道你会怎么用价值收尾让面试官知道你的级别。比如问“为什么用Redis做缓存”你可以先说Redis是内存型KV数据库读写性能高支持多种数据结构再举你们系统中的一个具体场景比如热点视频播放排行最后点明缓存带来的RT下降和数据库压力缓解。这个习惯能有效提升表达质量也会让面试官觉得你是个有工程思维的候选人。