
2023年途虎养车秋招后端开发岗笔试我是在开考前一小时才想起来要参加的。当时一边赶去图书馆找座位一边群里问有没有人做过这家公司的真题。后来整套题做下来我的感受是题不难但覆盖面很广Java基础、MySQL、Redis、Spring、算法都有整体偏“基本功大抽查”没有特别偏门的八股也没有让人摸不着头脑的智力题。如果你是准备投途虎后端岗的同学这篇复盘应该能帮你少走不少弯路。我先把这套笔试的情况交代一下。途虎养车是汽车后市场里头部玩家之一业务覆盖轮胎、保养、汽修、美容等平台上有门店体系、订单体系、供应链体系、会员体系后端要支撑的东西非常多。所以笔试里出现的题目基本就是围绕这些真实业务场景展开的不会像某些公司那样纯粹堆砌冷门八股。整体来看这份笔试题型分成三大块选择题、简答/设计题、编程题。选择题大概20来道覆盖Java基础、集合源码、并发、JVM、Spring、MySQL、Redis、计算机网络、操作系统简答设计题有2道一道是数据库表设计和SQL编写另一道是接口设计或场景方案设计编程题是2道算法题考得中规中矩LeetCode中等偏下难度不搞脑筋急转弯但写不出来就是写不出来。时间给得比较紧我记得好像是90分钟如果选择题想太久后面算法题会非常被动。这一点后面细说。需要先说明一下每年的笔试题型可能会调整本文更多是结合我个人经历和同期同学的反馈梳理了一份“最可能考到的方向”和“正确的复习姿势”不是押题更不建议只背这份内容去考试。你要把这篇文章当作一份地图知道重点在哪、坑在哪然后自己把对应的知识点吃透笔试才真正稳。1. 笔试整体设计与题型分布1.1 途虎后端笔试在考什么很多人准备后端笔试的时候有个误区上来就刷算法题觉得算法是王。但像途虎这种偏业务型的互联网公司后端笔试更看重的是“你有没有能力直接上手干活”。所以你会发现选择题里Java和数据库占比特别高Spring、Redis、JVM这些也是常客算法题反而是相对基础的那类。从热点关键词来看后端开发需要学什么、后端开发学习路线是很多人搜得最勤的内容。这其实反映了大部分同学的焦虑不知道复习重点在哪里。我的建议是先搞清楚笔试的“命题逻辑”。途虎的岗位要求里写得很明白需要扎实的Java基础、熟悉Spring Boot/Spring Cloud、熟悉MySQL与Redis、了解分布式基础那笔试就是沿着这条线来出的。我大概回忆了一下选择题涉及的知识点分布整理成了下面这个表格考察方向具体知识点出现频率Java基础与集合HashMap原理、ArrayList与LinkedList区别、异常体系高Java并发synchronized与ReentrantLock、线程池参数、volatile高JVM内存区域、GC算法、类加载过程中SpringBean生命周期、依赖注入、事务传播机制中高MySQL索引失效、事务隔离级别、MVCC、SQL优化高Redis缓存穿透/击穿/雪崩、持久化、过期策略中高计算机网络TCP三次握手、HTTP状态码、HTTPS流程中操作系统进程线程区别、死锁条件、虚拟内存低中从这个表可以看出这份题的核心思想就是你的计算机基础扎实不扎实Java后端常见组件熟不熟。没有偏到算法竞赛那种程度也没有特别偏门的东西但对知识广度有要求。1.2 题型分布与时间分配策略除了考察内容我觉得大家更关心的是“什么样的策略才能把题做完”。先说我的惨痛教训第一道选择题对JVM类加载过程犹豫了很久结果前面的题花了太多时间后面编程题差点没写完。这套笔试的时间设计是偏紧的不是让你优哉游哉做完全部还能检查一遍的节奏。我考完和几个同学对了对总结出一个比较合理的时间分配建议选择题控制在35到40分钟。选择题是单个知识点的小题会就是会不会就别死磕先标记一下跳过去。一道题纠结超过2分钟就是亏因为后面设计题和编程题的分值更高。简答/设计题控制在25分钟左右。这类题通常有一定套路你在脑子里列个大纲就可以写了不要想着写得十全十美。考场上追求的是在有限时间内把你掌握的东西写完整而不是写完美。编程题控制在25到30分钟。两题编程题建议先看两题的题干挑简单的那题先做。很多人一上来就挑战难的结果50分钟憋不出第二题实际上第一题可能10分钟就够。先拿稳的分再冲难的分。这个分配策略的核心逻辑是选择加编程加起来差不多是70分钟中间设计题25分钟正好卡在90分钟附近。当然每个人情况不同但大原则是一致的先做会做的再做可能要思考的最后拼一把没把握的。我打听到有些同学是先做编程题的这种做法我不太推荐因为编程题写起来容易上头一旦陷进去前面的选择题和设计题就全废了。2. 核心考点详解Java基础与并发编程2.1 HashMap、ArrayList、线程池等高频选择题答题思路Java基础这部分途虎考得最多的是集合类和并发。为什么这两块必考因为后端开发日常写代码几乎天天跟它们打交道。HashMap的扩容机制、hash算法、红黑树退化条件ArrayList和LinkedList的底层结构差异、扩容策略、增删改查的时间复杂度线程池的核心参数、任务提交流程、拒绝策略这些几乎年年出现。我说几个容易被扣分的点。HashMap的问题很多人能背出来“1.8之后是数组加链表加红黑树”但问到“为什么链表转红黑树的阈值是8”就卡住了。答案其实不复杂和泊松分布有关当负载因子是0.75时链表长度到达8的概率已经非常非常低了所以这个阈值是平衡空间和时间的产物。另外还要注意转红黑树之前有个条件数组长度必须大于等于64否则先扩容而不是转树。笔试选择题经常把这个条件隐藏在两个选项里就是用来迷惑你的。线程池的经典考法是给你一段代码问核心线程数1、最大线程数2、队列容量3同时来了6个任务问最终会怎样。这种题考的就是ThreadPoolExecutor的执行流程先判断核心线程是否已满没满就创建核心线程执行满了就丢进队列队列满了再判断是否达到最大线程数没达到就创建非核心线程达到最大线程数就走拒绝策略。很多人会把“先看核心线程还是先看队列”搞混导致后面全错。我建议复习的时候不要只背结论要把Jeremy的完整链路走一遍任务提交 - 核心线程判断 - 队列判断 - 最大线程判断 - 拒绝策略。这个过程理解透了选择题里无论怎么变着法考你都能推出来。注意途虎的选择题有一个特点选项之间区分度不高经常是“一个概念换个说法”。比如考volatile正确选项是“保证可见性不保证原子性”错误选项是“保证可见性也保证原子性”看起来只差两个字但意思完全不同。做题的时候建议把选项当成判断题来做每个选项都对错标记出来这样正确率会高很多。2.2 JVM与Spring考点不只是背八股JVM部分途虎笔试题考得还算常规内存区域划分、GC判断、类加载过程是重点。但要注意途虎不会直接问你“JVM内存分几块”这种幼儿园题而是喜欢给你一段代码或者一个场景让你判断对象什么时候可以被回收、某个变量存储在哪个区域。这种题是真正区分“背过八股”和“理解原理”的分水岭。举个例子选择题里考过“String s new String(abc)创建了几个对象”这题看着简单但很多人会忽略字符串常量池里可能已经有“abc”的引用所以答案可以是1个也可以是2个。考的不是你会不会背答案是几而是你知不知道常量池和堆的关系。Spring这块考的是Bean生命周期和事务传播机制。我印象最深的一道题是问“Bean的构造方法、初始化方法、BeanPostProcessor的postProcessBeforeInitialization和postProcessAfterInitialization的执行顺序”这题我刷过类似的原题但如果没准备过现场推很容易出错。顺序有标准答案实例化 - 属性填充 - postProcessBeforeInitialization - afterPropertiesSet - 自定义init方法 - postProcessAfterInitialization - 使用。这链路大家最好能写出来因为不只是选择题设计题里也可能让你描述。事务传播机制也是高频考点REQUIRED、REQUIRES_NEW、NESTED这三种要重点理解区别REQUIRED是有事务就加入没有就新建REQUIRES_NEW是无论如何都新建一个把当前事务挂起NESTED是嵌套事务基于savepoint实现回滚时可以只回滚内层。笔试题经常以“同一个类中方法A调方法B两个方法都有Transactional注解A方法内部调用B方法时事务是否生效”来考这其实是Spring AOP的自调用失效问题答案是B方法的事务不生效因为调用发生在代理对象内部。我当时备考的时候每天会花一到两个小时专门整理这类“容易混淆的知识点对比”把并发、JVM、Spring三块的知识做成表格放在备忘录里考前过一遍非常有用。具体来说类似这样考点核心区别或易错点synchronized vs ReentrantLock一个是JVM层面、一个是API层面ReentrantLock支持可中断、可超时、公平锁volatile vs AtomicIntegervolatile只能保证可见性和有序性不能保证原子性AtomicInteger通过CAS实现原子操作HashMap vs HashtableHashMap线程不安全、允许null键值Hashtable线程安全但性能差基本已被替代强引用/软引用/弱引用面试常考笔试也偶尔出现注意软引用在OOM时会被回收弱引用在下一次GC时就被回收类加载双亲委派先父后子的加载顺序目的是保证核心类不会被篡改3. 数据库与中间件MySQL Redis 是重头戏3.1 索引优化与SQL编写的场景化考察途虎的笔试里MySQL相关的题占的分量很重尤其是SQL编写和索引设计。这与途虎的业务模式强相关——途虎有大量订单数据、门店数据、用户数据数据库的设计和查询效率直接影响系统体验。我记得题目里有一道是让你设计一张订单表并且写出一条查询某门店某时间段内订单数量的SQL。考察点看着基础但里面藏了不少坑订单表主键要怎么选要不要考虑分库分表时间字段用什么类型状态字段怎么设计。SQL的话考察WHERE条件的索引命中情况、GROUP BY和ORDER BY的性能影响、分页的写法等等。关于索引优化他们喜欢考这几种场景联合索引(a, b, c)查询条件是b和c索引是否生效。答案是不生效因为跳过了最左前缀a。查询条件里对索引列做了函数运算或隐式类型转换索引是否生效。答案是不生效或者可能部分生效。范围查询后面的列索引是否生效。比如a 1 and b 2联合索引只有a能用到b的索引会失效。这些考点在力扣上刷不到是纯工程经验。我备考时就是用这种办法练的找一张有数据的表用EXPLAIN看各种SQL的type字段和key字段。type从好到差一般是这样system const eq_ref ref range index ALL。如果看到ALL全表扫描而你又建了索引基本就是索引没生效。笔试时遇到“这个SQL怎么优化”的问题可以先答加索引、再答改写SQL、再答覆盖索引和冗余字段层次递进显得有理有据。另外事务隔离级别和MVCC在途虎笔试中也出现过常考的是“InnoDB默认隔离级别是什么”、“可重复读怎么解决幻读”。注意InnoDB的可重复读下快照读是通过MVCC解决的而当前读需要通过next-key lock锁住范围来防止幻读。很多人答“可重复读解决了所有问题”就是不准确的笔试选择题里这个陷阱很常见。3.2 Redis缓存与分布式场景的答题思路途虎这种业务模式像热门商品、门店信息、用户购物车、优惠券领取状态都很依赖Redis做缓存。所以笔试考Redis一点不意外。选择题里常考的是缓存穿透、缓存击穿、缓存雪崩三个概念的区别和解决方案。我建议复习的时候别只背定义要连解决方案一起记缓存穿透是查一个不存在的数据每次请求都打到数据库。解决办法是缓存空值或者用布隆过滤器先过滤掉不存在的key。其中缓存空值的过期时间要设置得短一点否则大量不存在的数据会堆积在Redis里造成内存浪费。缓存击穿是某一个热点key过期瞬间大量并发请求同时打进来。解决办法是互斥锁只放一个线程去查数据库回填缓存其余线程等待或者直接使用默认值。缓存雪崩是大面积key同时过期或者Redis实例不可用导致所有请求打到数据库。解决办法是给过期时间加上随机值避免同一时间集体失效高可用上配置主从和哨兵。还有一类题是给你一个业务场景让你设计缓存方案。比如途虎这种场景用户进入首页要展示最近浏览的门店/商品你怎么设计我当时答的思路是先用Redis的ZSet按时间维度存储用户浏览记录score用时间戳value用门店或商品ID每次读取时ZREVRANGE取最近N条再根据ID去数据库查详情。如果还嫌慢可以把详情也缓存一份但要注意更新时机。这种题没有标准答案但你要体现出你理解缓存与数据库的一致性问题和过期策略。Redis持久化方面RDB和AOF的对比也是热点RDB是快照恢复快但可能丢数据AOF是日志根据刷盘策略丢失窗口不同但数据更可靠。选择题里如果问“要求最多丢1秒数据应该选择哪种持久化方式”答案是AOF且everysec策略。对于复习时间有限的读者我给你的建议是缓存穿透/击穿/雪崩这三兄弟的解决方案要写到滚瓜烂熟过期策略和内存淘汰机制要知道两者区别尤其是什么是LRU近似算法Redis为什么快可以从单线程、IO多路复用、内存存储、高效数据结构这几个方面来答。这几条覆盖了大部分Redis考点。4. 算法题与设计题业务场景是底色4.1 考场上常见算法题的解题思路途虎的编程题普遍不算难我在准备阶段刷过途虎往年的题风格和LeetCode中等偏下难度类似。我记得这次碰到的一道是类似“合并两个有序数组”的变形题另一道偏向字符串处理或者模拟题。笔试不像面试手撕代码那么紧张但要在有限时间内通过所有测试用例也不是随便写写就行的。我的建议是准备这类企业笔试不用去死磕困难题把LeetCode Hot 100里面简单和中等的题目刷熟尤其是双指针、哈希表、滑动窗口、简单的动态规划基本就够用了。途虎不是那种疯狂出hard的公司核心是考察你能不能写出无bug、能运行的代码。但很多同学会忽略一个问题笔试平台用的是牛客或者赛码不是LeetCode。LeetCode只要写完代码就行牛客系统还要求你import一些包有的函数名字都不能写错比如public class Main、public static void main(String[] args)。我有个同学笔试时直接把类名写成了Main2编译都过不了白白丢了一整题的分。这个细节在备考时一定要提前熟悉笔试前先去牛客做几道输入输出的题目练一下Scanner的用法特别是next()和nextLine()混用时会吞掉换行符的问题这是最容易踩的坑。代码风格上我建议在笔试时也保持写企业级代码的习惯变量命名清晰函数拆得合理关键步骤加注释。阅卷系统虽然只看正确性但有些公司笔试后会有面试官人工看一下代码质量。我认识一位途虎的面试官朋友他说在笔试分相近时他们会倾向于进入代码写得更规范的人的面试。你以为笔试只看对错实际上也看专业度。4.2 开放性设计题的作答框架途虎的简答/设计题我印象中比较有代表性的一道是假设途虎有一个门店库存查询功能要求设计一个接口返回某城市某款轮胎在附近门店的库存情况需要考虑性能和数据一致性。这种题对于没做过实际项目的人来说可能一头雾水但其实有相对固定的作答框架。这种题你要按下面的思路去展开先定接口定义请求参数和响应结构再设计存储包括MySQL表结构、Redis缓存策略再谈性能优化比如附近门店用地理坐标或Geohash处理库存用缓存异步扣减最后谈一致性问题比如怎么避免超卖、怎么做库存恢复。核心是让阅卷人看出你有“全局设计”的意识。你不是在背一个固定的API而是在思考一个真实业务场景里遇到的问题。答题时可以适当用文字描述接口和数据结构不用写出完整代码但如果你能给出一个清晰的伪代码/字段定义会显得你更有工程经验。我觉得这个类型的题目重点在于把你的思考过程展示出来而不是套用某一个标准答案。即使你设计的方案不是最优的但有条理、有依据、有取舍就是一份好答案。反过来说如果你只写一两句话“用Redis做缓存”那你大概率拿不到分。5. 备考策略与避坑经验5.1 按优先级分配复习时间如果你现在离笔试还有两到三周我的建议是按照“高频考点优先、其他知识梯度推进”的原则去复习。因为后端岗位的笔试范围广你很难面面俱到。与其焦虑自己哪里还没看不如先把一定会考的地方拿到分。优先级第一梯队Java基础集合、并发、MySQL索引、事务、Redis缓存三兄弟、持久化。这三块在途虎笔试里的占比接近一半而且无论选择题还是设计题都可能出现。复习时建议以“出题视角”去理解想想如果你是面试官你会怎么考这些内容。优先级第二梯队Spring/Spring Boot、JVM、计算机网络、操作系统基础。Spring在途虎笔试中比重不小JVM和计网考得相对常规操作系统比重最低。但你不能完全不看选择题里有几道。操作系统常考进程和线程的区别、死锁产生的四个必要条件、虚拟内存分页这些都比较固定。优先级第三梯队算法。算法是笔试必考但途虎的算法题难度不高所以不需要花大量时间在困难题上。每天刷两三道中等题保持手感直到笔试前就够了。如果觉得自己算法基础薄可以优先刷数组、链表、字符串、哈希表、栈队列这些主题。我自己的复习节奏可以参考白天上班或上课没时间就利用晚上8点到11点前1小时复习Java和MySQL中间40分钟复习中间件和计网等最后1小时刷算法题。每天两到三个小时坚持两周通过笔试问题不大。5.2 笔试中的隐性考察点笔试不只是在考知识点也在考你的临场时间管理和筛选重点的能力。有几点我觉得非常重要直接关系到你能不能发挥出真实水平第一笔试前检查环境。线上笔试的话提前测试摄像头、网络、浏览器是否兼容。我见过有人因为浏览器弹窗拦截了考试页面白白浪费5分钟。线下笔试的话多带几支笔和备用电池尤其是草稿纸。这些小细节看似不起眼但关键时刻能影响心态。第二正确理解题目描述。技术上的理解错误不丢人但要是把“求最大值”看成“求最小值”或者把“返回下标”看成“返回元素值”那就太冤了。我建议做题前把题目读两遍并且用自己的话复述一遍确认理解无误再动手。编程题尤其如此。第三注意审题的边界条件。比如一段字符串输入是否可能包含空格数组是否可能为空n是否可能等于0这些特殊输入在测试用例里出现很常见如果没处理就过不了测试用例。笔试的时候别急着提交先自己在脑内跑一遍边界数据。第四选择填空等客观题不会做也绝对不要空着。这类题型大多没有倒扣分机制不确定的选项根据上下文推测或者用排除法缩小范围。牛客系统上选择题也可能是多选注意看题目前的提示是“单选”还是“多选”历年都有同学因为没注意多选而失分。笔试是秋招路上第一道坎但它并不像很多人想得那么可怕。从我个人的体验来说途虎这套笔试题考得并不偏只要你把常见考点按优先级复习到位正常发挥是能通过的。最后再分享一个我自己的习惯每次笔试结束后不管结果如何我会立刻把遇到的知识点记到备忘录里尤其是那些没答上来的题当天就去查资料弄懂。秋招是持久战每一场笔试都是下一次的经验包考一题会一题后面的笔试就会越来越顺手。