尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

顺丰科技Android秋招笔试客观题考点与真题解析

顺丰科技Android秋招笔试客观题考点与真题解析 先说明一下我不是顺丰科技内部员工也不是阅卷人。只是当年秋招季亲身参加了这场笔试事后靠着回忆和同行交流把客观题部分逐题整理、验算、复盘过一遍后来又拿这些题给几届学弟学妹做过模拟训练。这份“顺丰科技2019秋招安卓开发工程师笔试客观题合集”本质上就是当年主流大厂安卓开发岗笔试的一张典型切片它考察的范围很固定计算机网络、操作系统、Java基础、Android四大组件与消息机制、数据结构、数据库。应付这类考试刷题是必要的但更关键的是搞清楚每道题背后的考点逻辑否则换个数字、换种问法照样会错。这篇文章我会把当年笔试客观题的高频考点、我做题时的思考过程、以及事后复盘总结的避坑点全部拆开讲适合正在准备安卓开发校招、社招笔试的读者。1. 这场笔试到底考什么题型分布与考点地图先说结论这份客观题合集覆盖的科目非常“标准”几乎没有偏题怪题但陷阱密度很高。它不像算法笔试那样要求你在代码框里手撕红黑树而是用一道又一道选择题快速检验你大学四年到底积累了多少计算机基础。1.1 顺丰科技Android岗位笔试的基本盘从题目结构来看整张卷子客观题部分大概占总分的一半左右剩下的才是编程题和简答题。客观题以单选题和多选题为主多选题少选、错选都不得分这一点非常致命。很多考生平时刷LeetCode刷得很欢但客观题答得一塌糊涂核心原因不是不会而是不熟悉这种“精确记忆”型考察方式。题型分布上我自己的统计是这样计算机网络约20%、操作系统约15%、Java基础约20%、Android核心知识约30%、数据结构与算法约10%、数据库约5%。安卓开发相关题目即便不是绝对多数也是必然出现的压舱石。这其实代表了当时大厂校招的一种共识基础扎实比项目花哨更重要。有意思的是这份笔试有个明显特征——它特别喜欢把你“好像会但其实没完全懂”的知识点拿出来考。比如HashMap在JDK 1.8前后的区别比如Handler的looper在子线程里怎么创建比如TCP三次握手能不能携带数据。这些都是平时写代码不太会触发但面试官默认你该懂的东西。1.2 各模块占比与复习优先级如果你现在才开始准备我建议你按这个性价比排序来分配时间Android核心知识 Java基础 计算机网络 操作系统 数据结构/数据库。安卓开发岗位的笔试Android部分永远是大头而且这部分的题目往往不是单纯的背概念而是把A、B、C三个知识点串起来考。举个例子题目可能会问“以下关于Activity启动模式说法正确的是”然后选项里混着singTask和singleTop的区别、onNewIntent的调用时机、以及taskAffinity的影响。一题考三四个点这在顺丰科技2019年秋招笔试题里非常典型。还有一个值得注意的点多选题的干扰项往往设计得很用心。它不是让你一眼看出对错而是四个选项看起来都对但有一个是在极端条件下才成立另一个则把适用范围悄悄扩大了一格。想拿高分光靠“记结论”是不够的必须把每个结论背后的适用边界搞清楚。2. 计算机网络与操作系统基础题的必拿分项先聊计算机网络和操作系统不是因为它们占比最大而是因为它们最好拿分也最好丢分。说最好拿分是因为知识点相对固定说最好丢分是因为很多细节你早就还给了老师。2.1 TCP三次握手与四次挥手的高频出题姿势TCP是客观题的重灾区几乎每套卷子都跑不掉。顺丰科技这份合集里相关题目主要集中在三次握手的状态变化、序列号确认机制、以及TIME_WAIT存在的原因。一个被我反复拿来考学弟的题目是这样的TCP建立连接过程中客户端发送SYN报文后进入SYN_SENT状态如果此时客户端收到SYNACK报文它会进入哪个状态答案是ESTABLISHED。但很多人会选SYN_RCVD因为记混了服务端的状态变化。这个题说白了就是考察你是否理解三次握手的双方状态机客户端和服务器在每一步看到的状态是完全不同的。还有一个高频变体问TCP三次握手是否可以携带数据。答案很微妙前两次握手不能携带数据第三次可以。原因也很简单前两次如果携带数据服务器在还没有确认客户端接收能力的情况下就要处理数据容易遭受SYN Flood放大攻击而第三次握手时客户端已经确认双方收发能力都没问题携带数据是合理的优化。这种细节题只看面经很难覆盖到必须真正理解设计意图。除了握手四次挥手中的TIME_WAIT也是常客。常考的点是主动关闭连接的一方在TIME_WAIT状态需要等待多久答案是2MSL。为什么是2MSL因为要确保自己最后发送的ACK能被对方收到如果丢失对方会重传FIN自己需要留出时间重新回应同时也要保证本连接内的所有报文在网络中消失避免影响后续使用相同端口的新连接。回答这个题的时候只写“等待2MSL”是不够的两个原因都要说全。2.2 进程与线程、死锁与内存管理的常见陷阱操作系统部分的题目主要集中在进程和线程的区别、死锁产生的四个必要条件、页面置换算法、以及虚拟内存与物理内存的映射关系。其中死锁相关的题正确率最低因为四个必要条件——互斥、占有并等待、不可剥夺、循环等待——看起来都认识但一放到具体场景里就容易对不上号。我印象很深的一道题是这样的以下哪个策略可以有效预防死锁A. 银行家算法 B. 资源有序分配法 C. 检测到死锁后杀掉进程 D. 设置资源访问超时时间。很多人会选A但银行家算法是避免死锁不是预防死锁C和D属于死锁检测与恢复手段。严格来说只有B是预防手段它通过破坏循环等待条件来防止死锁发生。这种“预防、避免、检测、恢复”四个层次的区分是操作系统选择题最经典的套路。内存管理这块虚拟地址到物理地址的转换、页表的作用、缺页中断的处理流程都是高频考点。有一道题我会专门记着当进程访问的页面不在内存中时CPU会触发什么事件答案是缺页异常。这里有个陷阱选项叫“缺页中断”我在考场上就觉得这两个说法差不多实际上中文教材里两者经常混用但严格来说它属于异常的一种由CPU在指令执行期间检测到并交由操作系统处理。如果选项里同时出现缺页中断和缺页异常优先选异常。操作系统的题刷起来性价比很高因为考点范围就那么大只要你把进程管理、内存管理、文件管理这三块的选择题全部过一遍基本不会失分。3. Java基础与Android核心知识拉开差距的关键如果说网络和操作系统是基本盘那Java和Android就是真正的分水岭。这部分题目尤其是Android相关的部分直接决定你能不能进下一轮面试。我在整理这份合集时发现一个规律Java基础题考查的并不是多高深的知识而是你有没有认真读过书。3.1 Java并发与垃圾回收的经典客观题Java并发这块synchronized和volatile的区别、线程池的核心参数、ConcurrentHashMap的锁机制是三大常客。有一道题让很多人翻车volatile关键字能保证什么A. 原子性 B. 可见性 C. 有序性 D. 持久性。标准答案是B和C但volatile不能保证原子性这段话几乎所有人都知道可一到了多选题里照样有人忍不住把A也选上。我后来分析原因在于大家把“volatile解决DCL问题”误理解成了“volatile能保证复合操作的原子性”。DCL的问题本质是重排序导致拿到了未初始化完成的对象volatile通过禁止重排序来修正但它并不能让i变成原子操作。这个边界如果记不清楚遇到变体题一定还会错。垃圾回收相关的题目GCRoots、可达性分析、Minor GC与Full GC的区别、以及各种垃圾收集器的适用场景都是笔试常客。一道很有代表性的题以下哪些对象可以作为GCRootsA. 虚拟机栈中引用的对象 B. 方法区中静态属性引用的对象 C. 方法区中常量引用的对象 D. 所有正在运行中的线程对象。答案是ABC。D有迷惑性因为线程本身不是GCRoots但线程中栈帧里引用的对象是。这个“线程”和“线程栈帧里的引用”之间的差别最容易踩坑。3.2 Android四大组件与Handler/Binder高频题Android部分的客观题值得你用最大的精力去刷。四大组件的启动模式、生命周期、以及它们之间的通信方式是绝对的高频。我当时整理了一份错题本发现出错最多的是Service这一块。大家平时写Activity写得最多Service本身就少用尤其是绑定服务和启动服务混合使用时onBind、onStartCommand、onUnbind的调用顺序经常记混。一道经典题目当一个Service既被startService()启动又被bindService()绑定时如果先调stopService()再调unbindService()Service会怎样答案是Service不会被销毁因为绑定状态还在只有先解除所有绑定再stop或者先stop再解除最后一个绑定时Service才会走onDestroy。这个逻辑很像引用计数你必须记住停止和解除绑定是两个独立的维度只有两个维度都满足销毁条件Service才会真正销毁。Handler机制更不用说了基本上是每份安卓开发笔试的必考大项。常考的点包括Looper.prepare()在子线程中必须先调用、Handler的dispatchMessage优先级、以及MessageQueue的next()方法为什么会阻塞。有一道我认为非常有水平的题一个子线程中new Handler()会抛出什么异常答案是RuntimeException具体报错是“Cant create handler inside thread that has not called Looper.prepare()”。这个题很基础但恰恰能把只看过Handler使用、没看过源码的人筛出去。Binder作为Android跨进程通信的核心客观题里出现的频率也相当高。常考的一个点是Binder通信中客户端调用远程服务方法时真正执行方法的是哪个进程答案是服务端进程。很多人被AIDL的“代理”概念搞混以为调用远程方法会在客户端本地执行其实客户端拿到的Proxy只是把参数打包并transact到服务端最终由Stub在服务端进程里执行真正的逻辑。这个“代理执行、服务端落地”的模型是理解Binder的钥匙。3.3 View绘制与性能优化题View绘制流程也是客观题里的常青树。measure、layout、draw三个过程的顺序onMeasure和onDraw的调用时机以及自定义View的性能优化点这些都在合集里占了不少比重。一道让我记忆犹新的题View.post()为什么能拿到View的宽高选项包括“因为post的Runnable会等measure和layout完成后才执行”、“因为View.post会触发requestLayout”、“因为post在绘制流程之后加入队列”、“因为主线程Looper空闲时才执行”。正确理解是如果View尚未attach到窗口View.post内部会先将Runnable存入一个等待队列等View完成attach和layout之后通过RunQueue统一执行此时宽高已经确定。这个知识点很细但能答对的人说明真的研究过View的源码。性能优化方面过度绘制、内存泄漏、布局层级优化是三大热点。其中内存泄漏的题几乎与Handler强绑定最常见的就是非静态内部类Handler持有外部Activity引用导致的泄漏。这类题通常会问“如何修复”正确姿势是把Handler声明为静态内部类并用WeakReference持有外部Activity的引用同时在onDestroy时移除所有消息和回调。4. 数据结构、算法与数据库客观题里的“硬骨头”这一部分在整套题里占比不算最高但包含的知识面极广经常以一道题带出一个完整知识点的形式出现。如果你复习时间有限算法和数据结构部分至少要把复杂度分析、常见树结构、排序算法的稳定性与复杂度背熟。4.1 复杂度计算与数据结构的典型题关于时间复杂度的题我见过最经典的陷阱是在循环体内删除ArrayList元素用for循环从前往后遍历删除时间复杂度是多少很多人觉得是O(n)但ArrayList的remove操作会导致后续元素整体前移最坏情况下每删一个元素都要移动O(n)个元素整体复杂度就成了O(n²)。如果改成从后往前遍历删除虽然remove本身还是O(n)但实际移动次数大幅减少不过时间复杂度理论上仍是O(n²)。真正O(n)的做法是用Iterator遍历并在iterator.remove()中删除因为它直接操作游标位置基于LinkedList删除也更快。这类题考的不是你会不会写代码而是你是否理解不同数据结构的底层存储方式。树的题里二叉搜索树的中序遍历、平衡二叉树的调整、堆的插入与删除都是高频。有一道题问完全二叉树有1001个节点其中叶子节点数是多少这个题可以直接用性质解n0 n2 1n n0 n1 n2完全二叉树的n1只能是0或11001是奇数所以一定有一个n1 0的情况算出n0 501。这个题计算量不大但考场上如果现场推公式容易慌张建议考前就把这几个公式刻在脑子里。排序算法更是客观题的常客。快速排序最坏情况的时间复杂度、堆排序的空间复杂度、稳定排序有哪些这三连问经常打包出现。你要记得一组结论稳定排序有冒泡排序、插入排序、归并排序、基数排序不稳定排序有选择排序、希尔排序、快速排序、堆排序。空间复杂度上归并排序O(n)最大快速排序O(log n)是递归栈开销堆排序O(1)原地完成。4.2 数据库索引与事务的常见客观题数据库题不多但考得很集中索引失效场景、事务的ACID特性、以及隔离级别对应的并发问题。有一道非常经典的题在什么情况下即使查询条件中使用了索引列索引也不会生效选项包括“对索引列使用函数运算”、“使用LIKE %xx这种前置通配符”、“OR条件中有一个非索引列”、“索引列参与了隐式类型转换”。这四个选项全都是正确答案如果出成多选题错选漏选都丢分。这个知识点其实是在提醒你索引不是万能的优化器判断走索引成本更高时也会放弃索引。事务隔离级别那边读未提交、读已提交、可重复读、串行化与脏读、不可重复读、幻读的对应关系必须背到脱口而出。MySQL默认是可重复读但很多人会答成读已提交因为Oracle的默认是读已提交。这种跨数据库默认值比较的题也是大厂笔试的爱考类型不只是考记忆更考你是否有工程实践的经验。5. 真题复盘十道有代表性的客观题精讲说了这么多宏观的考点接下来我挑了十道当年笔试考场上让我记忆深刻、或者事后复盘时觉得特别有价值的客观题逐题拆解。这些题能帮你理解出题人是怎么把知识点“包装”成陷阱的。5.1 网络与Java方向真题解析真题一TCP连接建立过程中第三次握手失败会发生什么先说结论如果服务器发送SYNACK后迟迟没有收到客户端的ACK服务器端会不断重传SYNACK重传次数达到阈值后服务器才会放弃这个半连接。很多初学者以为第三次握手失败后连接会直接释放实际上服务器不会立即释放而是进入重传状态。这个题的隐藏考点是TCP重传机制它在实际网络环境里非常常见比如客户端断网但未发出RST。我建议你这个细节一定要记清楚因为它比单纯背三次握手流程更能体现你对TCP的理解层次。真题二以下哪种方式可以避免ArrayList的ConcurrentModificationExceptionA. 使用Iterator遍历时调用list.remove() B. 使用for循环从后往前遍历删除 C. 使用CopyOnWriteArrayList D. 使用普通for循环删除后立即break。答案是BC。A错在“迭代器遍历过程中调用list.remove”会直接抛异常正确做法是调用iterator.remove()C是性能较低但不会抛异常的线程安全方案而D中如果只删除一个元素且删完就break确实不会触发modCount检查但它不能通用地避免异常所以不能作为标准答案。这道题做错的人很多因为它把一个冷门的“删除后立即break”场景混入选项中制造了巨大的迷惑性。真题三关于Java内存模型以下哪个说法是正确的A. 所有非静态变量都存放在堆中 B. 被static修饰的变量存放在方法区元空间中 C. 局部变量存放在虚拟机栈中 D. ThreadLocal中的值存放在栈中。正确答案是BC。A不对非静态变量不一定是引用类型基本类型变量直接内联在对象中仍然是堆上的数据但“所有非静态变量都在堆中”这句话容易让人误以为基本类型局部变量也被放入堆中这是错的D更明显ThreadLocal的值本质上存储在ThreadLocalMap中而ThreadLocalMap是Thread对象的属性它作为一个对象实例存放在堆上不是栈。D是典型的“看起来对实际错”的选项。5.2 Android方向真题解析真题四下列哪个方法一定会在Activity销毁前被调用A. onPause() B. onStop() C. onDestroy() D. onSaveInstanceState()。答案是A。这个题非常经典因为它考的是生命周期各种情况的交集。Activity销毁的路径可能有几种——用户按返回键、系统回收、配置变更导致重建——但在所有销毁路径中onPause都一定会被调用。onStop在某些极端情况下可能不调用比如内存极度紧张时系统直接杀进程、跳过了onStoponDestroy更是只有正常销毁才会触发onSaveInstanceState只在非用户主动销毁时触发。很多人以为onDestroy是必然调用的这个误解在面试中暴露率很高。真题五以下关于RecyclerView的缓存机制说法正确的是A. RecyclerView有四级缓存 B. 一级缓存是Scrap二级是CacheView三级是ViewCacheExtension四级是RecycledViewPool C. RecyclerView的缓存复用比ListView更合理 D. 所有缓存中的ViewHolder都不会重新绑定数据。答案选ABCD错。RecyclerView的缓存确实分为四级但只有一级缓存Scrap中的ViewHolder是可以直接复用且不重新绑定数据的CacheView缓存中虽然也不需要重新绑定数据但它只缓存位置匹配的View超出大小就进入RecycledViewPool而RecycledViewPool复用的时候必须通过Adapter重新绑定数据。这个题对源码的考察非常深能全对的考生至少在面试前已经把RecyclerView的复用机制从头到尾梳理过一遍。真题六自定义View时如果只需要改变测量模式而不改变尺寸应该重写哪个方法A. onMeasure B. measure C. setMeasuredDimension D. requestLayout。答案是A。严格来说你可以在onMeasure中直接调用setMeasuredDimension来设置最终测量宽高但如果你只是想根据父容器传入的MeasureSpec调整尺寸重写onMeasure是最标准的入口。选项B里的measure是final修饰的方法不能重写D的requestLayout是请求重新布局它会导致整棵View树重新measure和layout但不直接修改测量结果。这个题看起来基础却能筛掉不怎么写自定义View的候选人。真题七Android中下列哪些操作一定需要在子线程中执行A. 网络请求 B. 数据库写入 C. 大量数据的文件读写 D. 主线程中调用Looper.loop()。答案选AC。网络请求在Android 4.0以后不允许在主线程执行大量文件读写也有严格限制但数据库写入并没有硬性禁止只是强烈不建议而D的Looper.loop()必须在主线程或者更准确地说在需要处理消息的线程中调用子线程要开消息循环反而需要先Looper.prepare()再Looper.loop()。这个题暴露的是大家对“禁忌”和“建议”概念混淆的问题。5.3 数据库与算法方向真题解析真题八一张表有联合索引(a, b, c)以下哪些查询能用到索引A. WHERE a 1 AND b 2 B. WHERE b 2 AND c 3 C. WHERE a 1 ORDER BY c D. WHERE a 1 AND c 3。答案选ACD。A是最左前缀直接命中B没带a用不上C中a是等值匹配ORDER BY c在联合索引中可以被利用条件里没有b所以c不是完全有序但如果a是等值a相同的记录内c是有序的D比较迷惑虽然有a这个前缀但没有b所以只能用到索引的前缀部分c作为过滤条件需要回表验证但依然算能用上索引。这道题是对“最左前缀”的扩展考法非常经典。真题九一棵二叉搜索树的中序遍历是升序序列如果在这棵树中查找特定值时间复杂度是多少A. O(n) B. O(log n) C. 平均O(log n)最坏O(n) D. O(1)。答案是C。二叉搜索树如果平衡查找复杂度是O(log n)但如果插入顺序恰好是有序的树会退化成链表查找复杂度就变成O(n)。这个题很多刷题党秒选B但笔试考场上它特意强调了“这棵树不是平衡树”所以必须选C。它想提醒你数据结构的时间复杂度一定是分最好、平均、最坏三种情况来讨论的不能只背默认结论。真题十事务的隔离级别中可重复读会解决哪些并发问题A. 脏读 B. 不可重复读 C. 幻读 D. 丢失更新。答案是AB。可重复读通过MVCC解决了脏读和不可重复读但MySQL默认的可重复读在InnoDB下通过间隙锁可以在很大程度上解决幻读但从SQL标准本身来说可重复读并不能彻底解决幻读。这个题的关键是要区分“标准定义”和“MySQL实现”如果不加说明直接选幻读考场上就会丢分。6. 从这套题反推出来的备考建议与我的踩坑心得花了这么多时间整理这套顺丰科技2019秋招安卓开发工程师笔试客观题合集我最深的感受是笔试的客观题并不只是考知识点它考的是你在学习过程中有没有建立“知识的边界感”。你不仅要记得住结论还要记得住结论的适用条件和反例。下面这些经验是我当年踩坑踩出来的今天整理出来分享给你。6.1 我整理这份合集时踩过的坑第一不要迷信“刷题数量”而是要学会“错题归类”。我当时把刷过的Android笔试题错因列了一个清单发现90%的错误集中在这三类生命周期在极端场景下的调用顺序、集合类在并发环境下的行为差异、以及线程模型相关API的适用范围。这份顺丰科技的合集里至少一半的题都踩在这三个坑上。如果你能针对自己的错题做类似归类复习效率会高很多。第二多选题宁少选不要瞎选。我见过太多人为了多拿分在不确定的选项上打勾结果整题零分。客观题中的多选尤其是在安卓开发笔试里错选一个就等于白做如果你能排除两个选项剩下两个中有一个还拿不准我建议你只选自己有把握的那个至少能保一分。这个策略很现实但考场本来就是用来拿分的。第三一定要对“源码级细节”保持敏感。很多人复习Android只停留在API使用层面但笔试问的是“为什么”。比如Handler机制你要知道Looper和MessageQueue的关系要能说清楚为什么子线程不能直接new Handler比如RecyclerView你要清楚它的缓存层级和复用条件。这些不是靠背面经能覆盖的必须自己真的去读源码、画时序图、亲手写个小demo验证。第四时间分配很重要。客观题部分我建议先做Java和Android再做网络和操作系统最后做数据库和计算题。原因很简单Java和Android是安卓开发岗位笔试的权重核心占分最多且对你来说最熟悉先拿稳这些分后面的题做起来心态也稳。计算类题目如果卡壳超过2分钟直接标记跳过不要恋战很多题第一眼不会做完其他题后反而能想通。6.2 给准备安卓开发笔试的同学的实操建议如果你的笔试时间临近我建议你按下面这个节奏走前三天把计算机网络、操作系统、Java基础这三块的选择题高频考点全部过一遍不求深入但求每个选项为什么对、为什么错都能说清楚中间四天集中刷Android核心知识重点是四大组件、Handler、Binder、View绘制、性能优化这几章每道题都要求自己能举出一个反例最后三天做整套模拟卷严格控制时间模拟真实考场节奏。另外有一个小偏方把所有容易混淆的“成对知识”整理成一张双栏对比表贴在电脑旁边。比如singleTop和singleTask的区别、Handler和HandlerThread的区别、HashMap和Hashtable的区别、GCRoots和不可达对象的区别、ArrayList和LinkedList的区别。客观题最爱考的就是这些成对概念你在看题的时候只要发现两个相似的项出现在不同选项里基本就是考点。关于数据库和算法题别看占比小就完全放弃。把索引失效的常见场景、事务隔离级别与并发问题对应表、排序算法的复杂度表这三张表背下来再加二十道经典选择题练手就足够应付大部分大厂Android岗笔试了。数据结构的题更简单二叉树度数公式、堆的插入删除调整过程、栈和队列的应用场景这些都属于送分题只要你平时写过代码基本不会错。最后再分享一个我自己的小习惯每次模拟笔试结束我会把错题用红笔在题目旁边写下“书上怎么说的、我当时怎么想的、实际应该怎么理解”三句话。这个做法看起来很笨但效果出奇地好。因为客观题丢分往往不是你不知道正确答案而是你的直觉认知本身就是错的哪怕你考前背过正确答案在时间压力下还是会沿着惯性走。三句话法能帮你把下一次做错的可能性压到最低。这套方法我带了好几届学弟学妹只要他们坚持到笔试前一周正确率普遍提升两成以上。希望能帮到你。
返回列表