ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

广联达2018校招Java笔试题全解析与备考指南

广联达2018校招Java笔试题全解析与备考指南 不是标题党也不是为了凑一篇“面经搬运”。我在整理近几年建筑信息化行业的开发岗笔试时发现广联达2018校招这套题挺有代表性考察范围覆盖了Java基础、数据结构、操作系统、网络、数据库和算法编程难度不算变态但坑特别多。尤其是那些“乍一看会做、一提交就错”的题专门收拾基础不扎实的人。这篇文章我会把整张卷子的题型结构、考点分布、典型题目和解题思路完整拆一遍最后附上我自己的笔试复盘和复习建议给接下来要参加类似校招笔试的同学做个参考。1. 笔试题整体设计与考点分布广联达的笔试题目风格和互联网大厂不太一样。它更偏传统软件企业的出题思路选择题量大、知识点细、边界条件抠得深编程题不会故意出超级难的算法竞赛题但要求你代码写得稳、风格干净、能处理各种异常输入。整套卷子的时间一般是90到120分钟题量在50到60道左右后面我会按实际经验说明。1.1 题型结构与分值分布我自己把2018年这套题复盘后整理出的结构大致是题型题量分值占比考察重点单选题20题20%Java语法细节、数据结构基础、操作系统概念多选题10题15%边界情况、易混淆知识点、框架原理填空题5~8题10%代码输出结果、简单计算简答题2~3题15%概念论述、场景设计编程题2题40%数组处理、字符串操作、排序查找算法这里有个很容易被忽略的点单选和多选混在一起一旦多选选错一个就全扣分非常磨人。很多同学复习时只看“重点大题”结果栽在前面这些看起来“简单”的选择题上。说实话后面编程题反而不是拉分主力前面选择题正确率才是区分度最高的地方。1.2 考点模块分类从题目内容来看这套笔试覆盖了六个大方向我按出现频率排个序Java核心基础约30%String、集合框架、异常处理、多线程、JVM基础数据结构与算法约25%数组、链表、栈、队列、二叉树遍历、排序操作系统与Linux约15%进程线程、内存管理、Linux常用命令计算机网络约10%TCP/IP、HTTP协议数据库约15%SQL编写、事务特性、索引原理设计模式与场景题约5%单例模式、观察者模式等这个分布其实反映了广联达作为建筑信息化软件公司的技术栈特点Java后端为主数据结构基础要求高数据库和网络需要扎实但对中间件和微服务的考察不深——因为校招更看重底子和可塑性。2. 高频考点逐项拆解与细节分析这一节我挑出现频率最高、也是大家最容易出错的考点逐个拆开讲。每个点我都会把题目背后的原理和踩坑点讲透。2.1 数组与指针的核心区别“数组和指针笔试题”是热词里专门有一条说明这个点坑了多少人。在Java里其实没有指针这个概念但广联达这套题里依然出现了和“数组引用”“值传递与引用传递”相关的题。经典题目下面代码输出什么为什么public class ArrayTest { public static void main(String[] args) { int[] arr {1, 2, 3}; change(arr); System.out.println(arr[0]); } public static void change(int[] a) { a[0] 100; a new int[]{7, 8, 9}; } }答案是100。很多同学看到a new int[]{7, 8, 9}以为数组被整体替换了但Java中传递数组时实参传递的是引用的副本。a重新指向新数组并不会影响外部的arr但通过a[0] 100修改的是同一个数组对象的内容所以arr[0]变成了100。如果这道题换成C语言的指针题答案就会完全不同。C语言里如果你传的是int*a new int[]{...}这个操作在C里甚至无法编译因为数组名本身不是可修改的左值。所以做这类题时要先确认语言再谈指针和数组的关系。2.2 String、StringBuilder、StringBuffer三者对比这是Java笔试题必考的点广联达的卷子也出了而且是多选题。题目大致是问以下关于String的描述哪些是正确的A. String是final类不可继承 B. String不可变所以是线程安全的 C. 字符串拼接效率最高的是String D. StringBuilder是线程安全的正确答案是A和B。C明显错误String拼接会产生大量中间对象效率最低D错误StringBuilder不是线程安全的StringBuffer才是。这个知识点背后考察的是JVM字符串常量池和对象创建机制。常量和new String()创建的对象存放位置不同intern()方法的作用也是高频扩展考点。如果题目再延伸一下问你String s1 abc; String s2 new String(abc);两者是否相等答案是false因为一个在常量池一个在堆内存。这些都是同一个原理链条复习时别孤立地背结论。2.3 HashMap的底层原理与扩容机制2018年的笔试题已经开始考HashMap了这也是Java集合框架里最常被问到的点。核心考点JDK1.7是数组加链表JDK1.8改为数组加链表加红黑树链表转红黑树的阈值是8红黑树转回链表的阈值是6默认初始容量16负载因子0.75扩容是原来的2倍元素重新计算索引位置常见的扩展题是会问如果两个对象的hashCode相同equals不同它们在HashMap中怎么存储答案是可以共存存放在同一个桶的链表或红黑树上。还有一道真题是问“HashMap和Hashtable的区别”答出线程安全、键值是否允许为null、初始容量和扩容方式这几个维度就够了。说实话这类题目不难但容易漏答建议用对比表格来记忆。2.4 进程与线程的区别这道题在选择题里出现也可能是简答题。考察的是操作系统的基础属于送分题但送分题也经常有人答不全。我的答题模板是进程是操作系统资源分配的最小单位线程是CPU调度的最小单位进程之间相互独立各自拥有独立的地址空间线程共享进程的地址空间进程创建销毁开销大线程创建销毁开销小进程间通信方式有管道、消息队列、共享内存、信号量等线程间通信通过共享变量、wait/notify等一个进程崩溃不影响其他进程一个线程崩溃可能导致整个进程崩溃如果题目再加上“Java中如何实现多线程”的知识点就要补充Thread类继承、Runnable接口实现、Callable和FutureTask三种方式以及最后一种能返回值、能抛异常的细节。2.5 数据库索引与SQL优化数据库题目占了15%这个比例不低。核心考察点索引的数据结构B树不是B树聚簇索引与非聚簇索引的区别最左前缀原则什么是回表查询笔试题里有一道比较经典的SQL题给一张员工表字段有部门编号、薪资、入职日期要求查询每个部门薪资最高的员工。这类题目表面上考SQL实际考的是分组取最大值是面试里反复出现的类型。我把这道题写出来供你练习SELECT e.* FROM employee e JOIN ( SELECT department_id, MAX(salary) AS max_salary FROM employee GROUP BY department_id ) t ON e.department_id t.department_id AND e.salary t.max_salary;还有一种写法是用窗口函数ROW_NUMBER()这在MySQL 8.0里也支持了但2018年大部分公司还用的是MySQL 5.7所以不会默认你掌握窗口函数。笔试时尽量写通用性强的SQL别炫技。2.6 单例模式的双重检查锁简答题或代码题中出了单例模式要求手写线程安全的单例。这是Java面试题的老演员了但每次都有不少人写错。双重检查锁的正确写法public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } }难点在volatile关键字。它修饰的变量保证了可见性同时禁止指令重排序。instance new Singleton()这行代码在JVM层面不是原子的它分为分配内存、初始化对象、将引用指向内存三个步骤。如果没有volatile在多线程环境下可能出现一个线程拿到了“未完全初始化”的对象。这个问题如果不清楚面试官追问时很容易露馅。3. 编程题实战与解题思路编程题两道占40分是卷子里最关键的部分。我做复盘的时候发现这两道题都不算“难”在思路上难在实现细节和边界处理上。下面我把原题的意思还原一下并给出完整的解题路径。3.1 题目一数组去重并保持顺序题目要求给定一个整数数组去除重复元素保持第一次出现的顺序输出新数组。比如输入[3, 1, 2, 1, 3, 4]输出[3, 1, 2, 4]。这题最直接的思路是用LinkedHashSet因为它的底层是哈希表加双向链表既能去重又能保持插入顺序public static int[] removeDuplicates(int[] arr) { SetInteger set new LinkedHashSet(); for (int num : arr) { set.add(num); } return set.stream().mapToInt(Integer::intValue).toArray(); }如果笔试环境不支持Java 8的stream就退回传统写法public static int[] removeDuplicates(int[] arr) { SetInteger set new HashSet(); ListInteger list new ArrayList(); for (int num : arr) { if (set.add(num)) { list.add(num); } } int[] result new int[list.size()]; for (int i 0; i list.size(); i) { result[i] list.get(i); } return result; }核心逻辑是利用set.add(num)的返回值如果返回true说明之前不存在加入结果列表返回false则跳过。这一步能省掉一次contains()判断时间复杂度为O(n)。还有一种情况是题目要求不能使用额外空间这就只能原地处理或者用排序后再去重的方法。但原题没有这个限制所以用集合是合理的。拿到题目先看清楚空间限制再决定方案。3.2 题目二字符串中最长无重复字符子串这道题非常经典LeetCode第3题的变体主要考察滑动窗口。题目要求给定一个字符串找出其中不含有重复字符的最长子串的长度。比如abcabcbb最长无重复子串是abc长度是3。标准解法是滑动窗口加哈希表public static int lengthOfLongestSubstring(String s) { MapCharacter, Integer map new HashMap(); int left 0; int maxLen 0; for (int right 0; right s.length(); right) { char c s.charAt(right); if (map.containsKey(c)) { left Math.max(left, map.get(c) 1); } map.put(c, right); maxLen Math.max(maxLen, right - left 1); } return maxLen; }这里最关键的一行是left Math.max(left, map.get(c) 1);有些同学会直接写成left map.get(c) 1这种情况下left可能往左退导致窗口范围错乱。比如字符串abba遍历到第二个b时left更新为2再遍历到第二个a时map中a的位置是0如果用left map.get(c) 1left就变成了1窗口反而扩大了结果就错了。所以必须用Math.max来保证left单调不后退。边界情况也要注意空字符串返回0单个字符返回1全相同字符如aaaa返回1这些在提交前都要自测一下。3.3 编程题的代码风格细节代码风格是笔试评分里一个隐形的得分点。虽然评分器主要看功能对不对但人工二次审查时代码风格会影响你的印象分。我建议笔试时注意以下几点变量命名要有意义别用a、b、temp走天下方法入口统一写成public static方便测试关键逻辑写注释尤其是容易出错的边界处理在本地IDE或草稿纸上先跑一遍示例输入确认输出正确再提交如果时间允许把时间复杂度和空间复杂度写在注释里体现工程意识还有一点很多公司的笔试系统用的不是标准输入输出而是直接调用你写的方法。所以确保方法的签名和题目要求完全一致不要自己随便改参数类型和返回类型。4. 备考策略与实战避坑指南一套卷子做下来最大的感受是能拿分的题不算少丢分的地方全在细节。下面我把备考时容易踩的坑和应对策略整理一下这些是我自己复盘时总结的针对性很强。4.1 高频丢分点汇总我对这类笔试做了个错题统计也参考了2018年应届生论坛上同学们分享的回忆版真题归纳出以下几个高频丢分点丢分点错误例子正确思路equals与混用用 比较String内容String内容比较必须用equals循环内修改集合foreach中直接list.remove()用Iterator或者收集后再删除线程安全的错误判断认为StringBuilder线程安全StringBuilder非线程安全StringBuffer安全SQL分组查询直接用GROUP BY查所有字段分组的非聚合字段要小心处理数组越界二分查找right初始化为lengthright length - 1多选漏选MySQL默认隔离级别选了读未提交默认是Repeatable Read表格里列的这些每个背后都有真实题目。比如“二分查找right初始化”这个点如果初始化成length而不是length - 1在查找边界元素时极容易出现下标越界。这种错误在选择题里考验的其实是“你在IDE里有没有踩过这个坑”。4.2 复习优先级和时间分配建议距离笔试还有两周的话我的建议是按照下面的比例分配时间Java基础复习占30%String、集合、异常、泛型、多线程是重点数据结构与算法占30%数组、链表、栈、队列、二叉树、排序力扣刷简单和中等难度数据库占15%SQL语句练习、索引原理、事务特性操作系统与网络占10%进程线程、Linux命令、TCP三次握手四次挥手真题模拟占15%找几套往年题或模拟题严格计时做一遍特别提醒一定要计时做整套题不要分知识点零散刷。笔试不只考察你会不会还考察你在90分钟内能完成多少。2018年这套题的题量不小如果前面选择题磨蹭太久编程题时间就会非常紧张。4.3 Linux命令题的备考思路热词里有“linux笔试题”和“亚信科技笔试题java”说明Linux命令也常被考察。广联达的笔试题里涉及Linux的不会特别深但常用命令一定得掌握。这里列几个最常考的查看进程ps -ef和ps aux查看端口netstat -tlnp查找文件find / -name xxx查看日志tail -f实时滚动、grep关键字过滤权限修改chmod 755 file压缩解压tar -zcvf和tar -zxvf如果考命令的作用而不是具体输入一定要把“作用是查看什么”和“常用参数是什么”一起记。比如tar -zcvf里z代表gzip压缩、c代表创建、v代表显示过程、f代表指定文件名光记整个命令不记参数含义遇到变体题就懵了。4.4 Java笔试题的常见坑与做题顺序考试做题顺序也很讲究。我的策略是先做编程题再回头做选择题。原因很简单编程题分值高而且有时候需要调试时间。如果先做选择题时间被大量琐碎知识消耗掉编程题容易匆忙收尾造成大面积失分。做题时遇到不确定的选择题先标记跳过不要在一道题上卡超过两分钟。笔试系统一般不支持返回修改但大部分系统可以标记再回头检查。如果你不确定某道题往往第一直觉是对的不要反复改动。另外注意多选题的评分规则选错、漏选都会扣分拿不准的选项宁可不选。4.5 简答题和场景题怎么拿高分这道题考查的是知识体系的完整性不能只写一句话。比如“简述HashMap的put过程”最完整的答案是分步骤表述覆盖hash计算、index计算、插入链表、判断冲突、转为红黑树、扩容这几个环节。表达上建议按照“先说结论、再说过程、最后补充边界情况”的方式组织这样层次分明、结构完整。遇到场景设计题比如“设计一个限时秒杀系统”不要慌乱。不管规模大小从缓存层、队列层、服务层、数据库层四个层面展开写就能覆盖大部分得分点。即使没接触过真实系统用概念和原理把方案的骨架搭出来也能拿到不错的分数。5. 常见问题与临场经验汇总作为已经经历过多次软件研发校招笔试的老手我在复习和复盘时也积累了不少实战经验这些在通用文档里很难看到这里分享出来希望能帮你减少试错成本。5.1 笔试常见问题速查问题具体表现解决办法编程题本地运行正常提交后报错大概率是类名或方法签名不对复制题目给出的方法签名不要自己改选择题答案不确定盲目猜题采用排除法先排除绝对错误项程序运行超时算法复杂度过高检查是否有嵌套循环尝试用HashMap优化查找数组越界运行时报ArrayIndexOutOfBoundsException写循环时统一用 length不写编译不通过少了import或者方法名写错考前把常用的import和API用法过一遍时间不够用编程题没写完先写暴力解法拿部分分不要空着5.2 关于“行测”和“性格测试”不少公司校招会附带行测题和性格测试广联达2018校招流程里也包含这类环节。虽然这类测试不计入技术分但会影响后续面试安排所以要按“积极、团队合作、抗压”的方向作答避免极端选项。比如“你是否经常独自完成任务比团队协作更高效”这类题不要选太绝对的回答系统会判断你的性格倾向是否符合岗位画像。这种测试没什么技巧保持前后一致就行。千万别想着“测试而已无所谓”因为有些公司真的会把这部分作为筛选条件的一部分一旦性格测试结果和岗位模型偏差太大技术面再优秀也可能被卡掉。5.3 校招笔试的进阶规划说一句比较实在的话广联达2018校招这套笔试题放到现在看难度不算特别高但知识点的覆盖率非常好。如果你能把这套题吃透再去参加其他传统软件企业和互联网公司的校招笔试都会轻松不少。后续还可以从这几个方向继续深入把LeetCode热题100按标签刷一遍重点练数组、字符串、链表、栈、二叉树数据库部分系统学一遍索引原理和SQL优化最好能结合实际业务理解Java基础部分过一遍《Java核心技术卷1》的集合和多线程章节找几套最新年份的校招真题计时模拟锻炼限时思维把自己的解题过程整理成错题本考前只看错题笔试的准备本质上是一个“查漏补缺”的过程短时间内想靠刷题数量取胜不现实针对性弥补薄弱环节才是高效路径。根据我自己的体会准备笔试最有价值的部分不是做对了多少道题而是通过复盘找到了自己知识体系里的漏洞。比如我当年复习的时候一直以为自己很清楚HashMap的原理结果做多选题时才发现“加载因子为什么是0.75”、“为什么红黑树阈值是8”这些细节我根本说不上来。后来我把这些高频题的底层原理全捋了一遍发现收益远超笔试本身后面面试中用到的很多知识都是那时候打下的底子。如果你手头有广联达或同类公司的历年笔试题建议认真做一遍复盘别为了“做题而做题”把每道错题背后的知识点吃透这场笔试才算没有白费。最后分享一个小技巧笔试前一晚别刷难题了把容易混淆的知识点表格拿出来过一遍早点休息比熬夜多刷十道题管用得多。
返回列表