ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

2023用友Java秋招笔试复盘:核心考点与备考指南

2026/9/1 17:47:04 拓冰建站 浏览量
2023用友Java秋招笔试复盘:核心考点与备考指南 2023年用友集团秋招Java岗笔试我是在九月中旬投的简历投完大概一周左右收到了测评邮件。那天下午我特意空出了两个小时关掉所有通知打开和笔试平台界面大眼瞪小眼心里其实没什么底。看了一圈网上能找到的往年面经信息非常零散有人说不难有人说题量大有人说全是Java基础和数据库还有人说算法考到了手写快排越看越慌。真正考完之后我才发现这场笔试其实有很清晰的套路——它考的不是刷题量而是你对自己学过的技术有没有形成体系化的理解。我身边好几个同学也投了用友大家在群里聊卷子发现考完的感受几乎一致单选多选覆盖面很广从JVM内存模型到JUC工具类都有涉及SQL题非常具体手写SQL占了不小分值最后还有两道现场编程题不算难但需要你经常写代码才能顺手写完。这篇复盘我尽量按照当时的做题顺序把题型、高频考点、我踩过的坑和复习建议都整理出来。如果你正打算投用友或者准备其他企业级应用方向的Java岗秋招这份内容应该能帮你在考前把复习重心放到正确的位置上。1. 用友笔试的整体情况与做题节奏先说大家最关心的用友2023秋招Java岗的笔试整体给我的感觉是中规中矩但考察面非常宽。这里说的“中规中矩”是指它没有那种偏到离谱的冷门问题几乎每一道题都能在常规的Java面试复习资料里找到对应知识点但覆盖面确实很大一不小心就容易漏掉你平时没太在意的角落。1.1 题型分布与时间分配我这场笔试大概的题型安排是这样的单选30道左右多选10道左右两道SQL手写题两道编程题整体时间90分钟。选择题每道分值不大但架不住数量多而且多选的少选、错选、多选都不得分所以不能靠蒙。编程题放在最后要是前面选择题磨蹭太久后面容易写不完。题型数量分值占比建议用时单选题约30道中等25分钟多选题约10道中等偏上15分钟SQL手写2道偏高15分钟编程题2道高35分钟建议拿到卷子先快速扫一遍编程题了解题目大概方向心里有个底再去写选择题。我当时就是先看了最后两道编程题知道是链表和字符串相关的题心里踏实了不少回头做选择题的时候也没那么焦虑。1.2 题目难度对比和互联网大厂比起来用友的笔试难度其实不算特别高但它有一些自己的特点。互联网大厂笔试喜欢出偏技巧性的算法题比如动态规划、贪心、复杂的图论题用友更偏向考察基础知识的扎实程度和实际编码能力。这意味着你不需要去卷那种偏难怪的算法难题但必须把Java核心基础、集合框架、JVM、并发编程、Spring、MySQL这些老老实实啃透。我记得有一道选择题问的是“以下哪种方式不能正确创建一个线程”选项有继承Thread类、实现Runnable接口、实现Callable接口、直接new一个Thread对象不启动。这种题放在平时觉得so easy但人在考场上的状态确实容易迷糊越是简单的基础题越容易因为审题不仔细翻车。2. Java基础核心考点复盘Java基础是用友笔试的重头戏粗略估了一下选择题里有一半以上都直接或间接落在Java基础上的范围内。复习的时候不要只盯着Sring、集合、异常这些最表面的东西JVM、反射、注解、泛型、枚举这些也经常出现。2.1 字符串与包装类的常见坑凡是用友这场卷子里涉及String的题几乎都是在考察“不可变性”和“常量池”。比如有一道题给出了三段代码问哪一段创建了两个String对象还有一道题考的是new String(abc)到底创建了几个对象。这种题光靠背结论不行得把底层原理理清楚。new String(abc)如果常量池中已经存在“abc”那堆中创建了一个String对象指向常量池里的“abc”这里只有1个对象如果常量池里还没有“abc”那么会先在常量池创建“abc”的字面量再在堆中创建String对象一共2个对象。考场上脑子里要把这个创建过程完整过一遍。包装类相关的题也有几道核心聚焦在Integer缓存区上。Integer默认缓存-128到127之间的数值所以Integer a 100和Integer b 100用双等号比较是相等的但Integer a 128和Integer b 128用双等号比较就不相等了。用友很喜欢这种细节题因为它在实际开发里确实容易踩坑特别是做缓存或判断的时候。2.2 集合框架的考点清单集合框架这部分用友考察的重点非常集中。HashMap、ArrayList、LinkedList、HashSet、TreeMap这几大件几乎是必考考的维度有三个底层数据结构、线程安全性、扩容机制。HashMap的考察率极高重要程度不用强调。你至少要把这几个问题背熟底层是数组加链表加红黑树的结构链表长度超过8并且数组长度超过64时树化加载因子默认0.75扩容时容量翻倍。考场上有一道多选就是问HashMap在JDK 8之后的改进选项里混着“头插法”、“尾插法”、“红黑树”、“CAS操作”我当时选了尾插法和红黑树后面对了下答案应该没错。ArrayList和LinkedList的区别也是常客一个基于动态数组随机访问快尾部插入快但中间插入删除需要移动元素一个基于双向链表插入删除只需改指针但随机访问需要遍历。有一道题问“频繁在列表中间插入和删除应该选择哪个实现类”这种题就是送分题但你要是没分清楚原理也会白白丢分。HashMap不是线程安全的ConcurrentHashMap才是而且ConcurrentHashMap在JDK 8之后用的是CAS加synchronized来保证并发安全锁粒度比JDK 7的Segment锁更细。用友考过一道关于ConcurrentHashMap的题问的是它为什么能比Hashtable并发性能更好本质就是锁粒度的问题。2.3 异常体系与try-catch执行顺序异常这块用友考了一道非常经典的问题try块中有return语句finally块中也有return语句执行的顺序是怎样的。答案是finally中的return会覆盖try中的return因为return的数据会先保存但finally的return是新的返回指令。我在备考的时候专门研究过这个问题最终的结论是如果try和finally都有return将以finally为准但在实际代码规范里不要在finally中写return因为会让异常被吞掉。还有一道题考的是Error和Exception的区别。Error是JVM层面的严重问题比如OutOfMemoryError、StackOverflowError程序无法恢复Exception是程序可以处理的异常分为受检异常和非受检异常。这道题本身不难但选项里把ClassNotFoundException和NoSuchMethodError放在了一起有点混淆视听的意思还好我平时写过反射代码知道ClassNotFoundException是Exception体系的。2.4 JVM内存模型与垃圾回收JVM的选择题用友一般会出两三道集中在内存模型和垃圾回收上。内存模型这块考了栈和堆各自存放什么方法区在JDK 8之后变成了元空间字符串常量池被移到了堆中。有一道题我印象很深问的是“以下哪个区域不会发生OutOfMemoryError”答室是程序计数器因为它的内存空间很小是唯一一个不会OOM的区域。这种题你要是只背了大概不知道程序计数器这个冷门知识点就很容易选错。垃圾回收算法也考了标记整理、标记清除、复制算法的优缺点还有一个题问到“CMS收集器使用的是哪种算法”答案是标记清除。CMS的缺点包括会产生内存碎片、并发阶段占用CPU资源这些在JVM调优的时候会经常提到。用友毕竟是大厂对JVM底层原理的关注度还是蛮高的建议复习的时候把《深入理解Java虚拟机》的前几章读透应付笔试足够了。3. 多线程与并发控制考察方向多线程这部分用友笔试的考核难度不低但题型很稳。考的还是那些经典考点线程状态流转、锁机制、并发容器、线程池参数。如果你平时只用过synchronized而没深入了解过JUC包这部分可能会有点吃亏。3.1 线程状态与wait/sleep/notify线程状态那道题问的是一个线程调用join让另一个线程等待等待的状态是什么答案是WAITING。Java线程状态共有NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED六种WAITING和TIMED_WAITING的区别就在于等待是否限定了时间。Thread.sleep()和Object.wait()的区别也是一个经典高频题。sleep不释放锁wait释放锁sleep是Thread的静态方法wait是Object的实例方法sleep到时间自动恢复wait需要notify或nofifyAll唤醒。考场上多选题里就有一道这种题四个选项分别描述这两个方法的行为我当时逐个比对才敢做出选择。还有一道题问到“notify唤醒后线程是立即执行还是等待锁”正确答案是等待锁。wait线程被唤醒后会进入BLOCKED状态等持锁线程释放锁后才能重新进入RUNNABLE。这个知识点如果你没实际写过生产者消费者模型确实容易搞混。3.2 JUC工具类与AQSJUC这块用友考了一道关于CountDownLatch和CyclicBarrier的对比题问的是两种工具类的区别。CountDownLatch是一次性的主线程等待多个子线程完成CyclicBarrier可循环使用多个线程互相等待到达同一个屏障点后继续执行。这种题考的是概念区分理解它们各自的应用场景就能答对。信号量Semaphore也考了问的是“Semaphore(3)表示什么”答案是允许3个线程同时访问临界资源。项目里做限流或连接池管理的时候常会用到如果你在生产环境里写过接口限流用AOP加Semaphore实现过这种题就是送分。AQS本身也有一道多选题列了几个关于AQS的选项比如“AQS是一个FIFO的双向队列”、“AQS是很多同步工具的基础实现框架”、“AQS使用了CAS操作”、“AQS只能实现独占锁”。前三个是对的第四个是错的因为AQS同时支持独占锁和共享锁。这个知识点需要你对ReentrantLock、Semaphore、CountDownLatch这些组件的源码实现有一定的了解才能知道它们内部都继承自AQS。3.3 线程池参数与拒绝策略线程池是JUC考察的重中之重用友笔试甚至单独出了一道题来问ThreadPoolExecutor构造器里的若干参数含义然后又有一道题考拒绝策略。核心参数有七个核心线程数、最大线程数、空闲存活时间、时间单位、任务队列、线程工厂、拒绝策略。拒绝策略这块考了几种常见实现AbortPolicy直接抛出RejectedExecutionExceptionCallerRunsPolicy用调用者线程执行任务DiscardPolicy直接丢弃任务DiscardOldestPolicy丢弃队列中最旧的任务。有一道场景题问“任务提交非常频繁不想丢弃任务想让提交任务的线程自己去执行该怎么办”答案是CallerRunsPolicy。这种题不考概念考你能不能把拒绝策略和真实业务场景对应上。线程池参数的设置原则也被问到了CPU密集型的业务核心线程数一般设置为CPU核数加1IO密集型的业务核心线程数一般设置为CPU核数乘以2。用友这道题给的场景是“一个计算密集型任务服务器是4核CPU”我选了5这是标准的经验值。4. Spring与数据库相关高频题目用友主营企业级软件Spring框架和数据库是其技术栈的重中之重笔试中这两块内容的占比堪比Java基础。尤其是Spring Boot自动装配、Spring事务传播行为、MySQL索引和SQL优化相关的题属于必考方向。4.1 Spring IoC与AOPSpring的题用友主要考IoC和AOP的思想以及Spring容器的基本原理。有一道单选题是“Spring IoC容器中Bean默认的作用域是什么”答案是singleton。还有一道多选题问Bean的作用域有哪些包括singleton、prototype、request、session但request和session需要在Web环境中才生效这道题主要是考你对每种作用域的理解。依赖注入的方式也考了问的是“构造器注入和setter注入各自的优缺点”。构造器注入可以保证依赖不可变且能显式声明依赖顺序但会导致循环依赖问题setter注入更灵活但Bean可能处于未完全装配的状态。用友不愧是做企业级框架的公司对这种设计层面的问题很看重。AOP的题考了切面、连接点、切入点、通知这几个概念有一道题问“Before、AfterReturning、Around分别对应哪种通知类型”这种题对写过Spring AOP的人来说毫无压力但如果你只背概念没实际用过选项的干扰项还挺容易让你犹豫。4.2 Spring Boot自动配置原理Spring Boot自动配置是用友笔试里比较有区分度的一道题它考的不是你写不写得出来demo而是你理不理解SpringBootApplication注解背后的组合。SpringBootApplication是SpringBootConfiguration、EnableAutoConfiguration、ComponentScan三个注解的组合。自动配置的核心是auto-configuration的import机制根据classpath下的依赖和配置属性自动加载需要的Bean。有一道题问“如何排除某个自动配置类”答案是在EnableAutoConfiguration或SpringBootApplication中exclude指定的配置类或者通过配置文件spring.autoconfigure.exclude。我当时在复习这块的时候专门看过一个starter源码所以对这个知识点还算熟。建议备考的时候找一个自己常用的starter看看它的spring.factories理解一下SPI机制很多概念就会自动串起来。4.3 MySQL索引与SQL优化数据库这块用友出了一道最让我头疼的题——给一张员工表字段包括emp_id、emp_name、dept_id、salary然后问在查询“部门平均薪资大于5000的部门”时下面哪个SQL是对的。看似简单实际上考的是HAVING和WHERE的区别以及GROUP BY的正确使用。正确答案是使用GROUP BY dept_id HAVING AVG(salary) 5000。WHERE不能和聚合函数一起使用必须用HAVING。因为我在学校平时写SQL比较多这种题没花太长时间但如果你只在MyBatis的XML里拼过查询这种聚合分析可能没那么熟。索引的题目也很典型问的是“联合索引(a, b, c)在哪些查询条件下能命中索引”选项里包含非常多容易混淆的写法WHERE a1 AND b2 AND c3WHERE b2 AND c3WHERE a1 AND c3。最左前缀原则是核心只有where条件里包含a字段时才会走这个联合索引。不看a字段的查询即使其他条件再多也走不了这个索引。还有一些SQL题考了事务隔离级别。默认级别是REPEATABLE READMVCC的版本链机制以及幻读的解决方案是间隙锁。这种题在笔试中出现的频率很高在MySQL的InnoDB引擎中事务隔离级别默认是REPEATABLE READ。有一道题专门问“MySQL默认隔离级别是什么”给出的选项有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE正确答案是REPEATABLE READ。这里要注意和Oracle的默认隔离级别READ COMMITTED区分开我当时在复习时候把这两个默认值放在了对比表格里考场上看到直接选了。4.4 Redis缓存与分布式锁用友本身的企业级产品大量使用了Redis所以笔试中Redis的题也是有的。有一道选择题问Redis支持的数据结构有哪些选项里除了字符串、哈希、列表、集合、有序集合之外还掺杂了“数组”和“树”这明显是在考察基础记忆。当时选了前五个和后两个但仔细想了一下Redis确实没有数组和树这种原生数据结构这个题应该是单选或判断性的应该只选前五个。分布式锁的题也有一道。场景是“多个服务实例同时执行业务如何保证同一时刻只有一个实例执行”A选项是使用Redis的SETNXB选项是使用ZooKeeper的临时顺序节点C选项是使用数据库的唯一索引D选项是使用Java的synchronized。正确答案是A、B、C因为synchronized只能锁住单个JVM内部多个服务实例情况下是无效的。这种题考察的是分布式场景下的常见方案如果你不了解分布式锁的原理不要凭空猜测。5. 手写SQL题与编程题实况用友笔试的最后环节是手写SQL和编程题这部分相对前面选择题来说区分度反而更高。选择题你不会的大概率还可以排出几个选项来猜一猜编程题如果平时没真正写过代码是不可能靠感觉蒙出来的。5.1 手写SQL题多表关联与聚合查询第一道SQL题的大概场景是有两张表一张是学生表studentstu_id, stu_name, class_id一张是成绩表scorestu_id, course_id, score。题目要求查出“每门课程分数最高的学生姓名和分数”。这里有一个容易踩的坑直接用MAX(score)查出的是最高分数但如果不做关联你拿不到这个最高分对应的学生姓名。我当时的写法是先用子查询查出每个课程的最高分再和原表关联SELECT s.stu_name, sc.course_id, sc.score FROM score sc JOIN student s ON sc.stu_id s.stu_id JOIN ( SELECT course_id, MAX(score) AS max_score FROM score GROUP BY course_id ) t ON sc.course_id t.course_id AND sc.score t.max_score;如果直接用GROUP BY course_id然后SELECT出来具体的学生姓名在部分数据库的严格模式下会报错因为学生姓名没有包含在聚合函数中。用子查询是通用性最强的写法面试官在批改时也最容易认可。第二道SQL题考的是多表关联场景大概是订单表和用户表要求查出“在2023年7月到9月之间下单超过3次的用户信息”。需要用到JOIN、GROUP BY、HAVING和日期条件过滤和前面选择题的思路差不多只是这次需要自己写完整SQL。这里要注意的是日期的写法不同数据库对日期字符串的格式要求不同如果题目没指定数据库建议使用标准SQL写法。5.2 编程题A链表反转第一道编程题是经典的链表反转。要求输入一个单向链表返回反转后的链表。这个题目有两种常见的解法迭代和递归。我优先推荐迭代法因为用友这类公司虽然不指望你写出最花哨的实现但要求代码健壮、思路清晰public ListNode reverseList(ListNode head) { ListNode prev null; ListNode curr head; while (curr ! null) { ListNode nextTemp curr.next; curr.next prev; prev curr; curr nextTemp; } return prev; }我之所以选择迭代而不是递归是因为迭代的空间复杂度是O(1)而递归的空间复杂度是O(n)。大多数笔试环境对内存是有监控的万一链表特别长递归容易爆栈。另外用友的笔试平台好像是支持Java 8以上的我用的是普通的ListNode定义没有用到什么高级语法确保代码在考试环境里能直接编译通过。5.3 编程题B字符串字符统计第二道编程题是给定一个字符串统计每个字符出现的次数并按出现次数降序输出。如果出现次数相同按字符的ASCII码升序排序。这道题我用了HashMap配合排序先统计每个字符的频次再把entry放到List里排序public String frequencySort(String s) { MapCharacter, Integer map new HashMap(); for (char c : s.toCharArray()) { map.put(c, map.getOrDefault(c, 0) 1); } ListMap.EntryCharacter, Integer list new ArrayList(map.entrySet()); list.sort((e1, e2) - { if (!e1.getValue().equals(e2.getValue())) { return e2.getValue() - e1.getValue(); } return e1.getKey() - e2.getKey(); }); StringBuilder sb new StringBuilder(); for (Map.EntryCharacter, Integer entry : list) { for (int i 0; i entry.getValue(); i) { sb.append(entry.getKey()); } } return sb.toString(); }这道题可以在O(n log n)的时间复杂度内解决。如果你希望写得更好可以把排序换成桶排序把时间复杂度降到O(n)利用字符的出现次数作为桶下标。我考试时直接用了排序因为分钟级的时间内稳比炫技更重要代码短不容易出错。5.4 编程题的评分倾向从用友笔试编程题的风格来看它的核心重点不是让你写复杂的算法而是考察你的代码基本功。链表、字符串、数组、排序这些基础数据结构的操作能力是最常用的。很多大厂其实也是这样算法题的难度不在于你有没有做过原题而在于你能不能快速把思路转化为可运行的代码。我的建议是在正式笔试前用LeetCode的热门题单把链表、二叉树、数组、字符串四类经典题各刷三到五道不需要追求困难的标签题重点是保证自己能在碎片时间内写出一段可运行的代码。笔试不像IDE开发那么舒服你没有自动补全、没有丰富的插件提示真的会手生必须保持一定的编码手感。6. 踩坑复盘与备考建议笔试结束当天我在群里和大家对了一下答案发现有几个地方是大家普遍容易栽的。整理出来算是给之后准备用友笔试的同学提个醒。6.1 最大的坑审题不仔细形式上看用友的笔试界面很标准题目的长度也不算长但我发现一个规律选择题的选项往往非常细节比如“HashMap在链表长度超过阈值时会转换为红黑树”这本身是对的但如果题目问的是“以下哪个说法是错误的”你仍然可能下意识把它当作正确的选项勾上。考试的时候一定要先在题目里看清楚是选“正确的”还是“错误的”单选题还是多选题这关系到你的得分策略。还有一道题是关于HashMap初始容量的问的是“new HashMap(15)”的实际容量是多少。按照源码容量会被调整到大于等于指定容量的最小2的幂次方所以15对应的实际容量是16。如果不懂这个原理很容易直接选15。6.2 时间分配不合理导致编程题时间不足我调研了几个同学的做卷情况普遍反馈是前面的选择题比想象中花时间到最后编程题只剩二三十分钟或者为了赶时间代码风格混乱变量名随便写甚至没有时间检查边界条件。这个情况非常普遍。我自己的策略是限时做选择题单选的每道题不要超过40秒多选的每道题不要超过60秒。遇到卡壳的先选一个最可能的答案并标记不做过多停留。把省下来的时间分给SQL题和编程题因为它们一分不写就一分没有。前面选择题即使错了有时候还可以靠概率蒙对一点编程题空白就一定没有分。我还建议在笔试前做一个动作把你最常写的基础算法题模板准备好比如链表的迭代反转、数组的快排、二分查找、字符串的字符统计。不需要背而是通过多次手写形成肌肉记忆在考场上可以直接无脑敲出来省时间。6.3 知识点要建立体系不要散点式复习用友笔试给我的最大感受是它的考察逻辑非常“企业级”——不会只考单个孤立的知识点而是把知识点串联起来。比如考HashMap的时候会捎带问一下线程安全问题然后引出ConcurrentHashMap的分段锁和CAS考JUC的时候会顺着线程池参数延伸到业务场景下的参数设置。如果只背零散的概念很难在脑子里快速建立起这些联系。所以我强烈建议复习的时候画一张知识体系图不是给别人看的那种而是自己梳理。拿Java来说从基础语法出发到集合框架到并发编程到JVM调优再到Spring框架和数据库交互每一个模块之间都有天然的衔接。比如ConcurrentHashMap既涉及集合框架又涉及并发控制还涉及CAS原理这类“跨模块”知识点是笔试的高频出题点。6.4 简历项目经验带来的隐藏优势虽然笔试和简历没有直接关系但在秋招全流程里用友这种做企业级软件的厂商对业务理解能力是有要求的。单纯背八股文能过笔试但后续的面试环节会大量考察你的项目经验比如是否实际做过高并发的接口设计、是否处理过数据库的性能瓶颈、是否理解分布式环境下的一致性方案。这些内容如果能在笔试阶段就有意识地补强后面面试会顺很多。我不是劝你临时做个高并发项目但至少要把自己简历里写过的内容从头到尾把技术方案梳理一遍知道哪些地方可能会被追问。数据库MySQL索引的底层数据结构、Redis在项目中的具体使用场景、消息队列为什么为了削峰填谷这些问题要能逻辑清晰地讲明白。实际经历中我的一个体会是笔试也好面试也罢核心看的不是你背了多少个名词而是你对整个Java技术体系有没有形成自己的理解框架。技术栈可以作为起点但真正决胜的是你能不能把一个个零散的知识点织成一张网。用友这场笔试说到底就是在检验你到底有没有“织网”的能力。