每年春招一到,Android岗的笔试题就成了很多人的心病。我自己当年准备校招时把市面上能搜到的真题都翻了个遍,其中京东这套2019春招的开发类试卷给我留下的印象很深——题目本身的难度不算变态,但覆盖面非常典型:既有Java基础、数据结构这种通用考点,也有四大组件、Handler、性能优化这类Android核心知识,几乎就是一份浓缩版的Android岗必考清单。哪怕你求职的目标不是京东,把这份试卷的考点逐条吃透,也足够应对大部分互联网公司的Android校招笔试了。
这篇文章不打算贴原题和标准答案,那没什么参考价值。我按自己多年面试和带新人的经验,把这类试卷背后真正想考察的东西拆开讲清楚,包括每类考点的复习优先级、常见出题方式,以及一些容易被忽略的细节。无论你是正在准备校招,还是工作了几年想回头补基础,这份复盘应该都能用得上。
1. 京东春招试卷整体考察思路
1.1 试卷结构与分值分布解析
京东这套Android开发试卷整体沿用互联网公司笔试的经典结构:单选、多选、简答,外加一两道编程题。从分值比例来看,Java基础和Android核心差不多各占三成,数据结构与算法占两成,剩下的一成分散在计算机网络、操作系统和设计模式上。这个比例很能说明问题:大厂校招笔试题的定位不是筛选“会用某个框架的人”,而是筛选“基本功扎实、值得培养的人”。
选择题部分一般有20到30道,每道2到3分,覆盖的知识点非常杂。比如让你判断“下列哪个不是Activity的启动模式”“Looper.loop()为什么不会阻塞主线程”“哪种进程间通信方式适合传递大文件”这类题目,题干看似简单,但每个选项都是精心设计的陷阱。多选则更让人头疼,少选不得分,多选也不得分,这对知识掌握的精准度要求很高。简答题通常是2到3道,围绕内存泄漏、自定义View、消息机制等核心主题展开,要求你写出完整思路。编程题一般是1到2道,以LeetCode中等难度为主,但时间非常紧张,必须在完成前面题目的同时留出足够时间。
我的建议是先易后难,选择题控制在40分钟内完成,简答题每题控制在10分钟,编程题留足30分钟。千万不要在某道选择题上纠结太久,笔试的容错率远比大家想象的高,一道题两三分,丢了就丢了,为了它导致后面大题没时间做才是真正的损失。
1.2 考点覆盖范围与难度定级
把这套试卷的考点拉一个表,基本就能看清Android校招笔试的全貌。我按复习的优先级把这些考点分成了三个梯队,这个分法不仅适用于京东,对其他大厂也有参考价值。
第一梯队是必考且必须拿分的,包括Java集合与并发、四大组件、Handler消息机制、Activity启动模式和Intent传递。这些是Android开发的地基,无论哪家公司的笔试题都会出现。第二梯队是出现频率高但深度可控的,包括自定义View绘制流程、RecyclerView缓存机制、内存泄漏场景、ANR产生原因、进程间通信方式和多线程编程。第三梯队是偶尔出现但容易被忽视的,包括JVM内存模型、类加载机制、设计模式、HTTP协议细节,以及SQLite数据库操作。
从难度上看,选择题大多停留在概念辨析层面,只要系统复习过《Android开发艺术探索》和《第一行代码》就能覆盖。简答题开始考察表达能力,光知道结论不够,还要能把原理讲清楚。编程题才是真正拉开差距的地方,它同时考察数据结构和算法功底,以及代码规范和边界条件意识。比如手写一个单例模式、反转链表、两个线程交替打印数字,题目本身不难,但能不能在20分钟内写出无Bug的代码,很考验基本功。
2. 高频核心考点深度拆解
2.1 四大组件的原理与生命周期
四大组件几乎是所有Android笔试题的必考内容,而其中考得最多的就是Activity。启动模式作为最经典的基础题,几乎每套试卷都会出现。standard、singleTop、singleTask、singleInstance这四种模式的区别和应用场景必须烂熟于心:standard每次启动都会创建新实例;singleTop在栈顶复用,适合接收通知跳转的场景;singleTask确保栈内只有一个实例,适合应用主页面;singleInstance则单独占一个任务栈,适合来电界面这种需要全局唯一的场景。笔试还经常让你判断“A启动B,两个Activity的生命周期回调顺序”,答案是A.onPause → B.onCreate → B.onStart → B.onResume → A.onStop,这个顺序很多人会记错,需要特别注意。
Service和BroadcastReceiver也经常考。Service有两种启动方式,startService和bindService,它们的生命周期差异是高频考点:startService启动的Service与启动者没有关联,即使Activity销毁,Service仍然运行;bindService则与绑定者绑定在一起,所有绑定者解绑后Service就会销毁。Android 8.0以后后台启动Service受限,Android 9.0以后不能从后台启动Activity,这些限制也常作为选择题的选项出现。BroadcastReceiver的注册方式分为静态注册和动态注册,动态注册需要在onDestroy中反注册,否则会泄漏,这也是一个容易被忽略的考点。
ContentProvider虽然平时开发用得不频繁,但笔试还是会考。它作为跨进程数据共享的标准化接口,底层实现是Binder。Android 7.0以后,FileProvider作为ContentProvider的子类开始被广泛使用,用于解决应用之间共享文件时暴露file://URI的安全问题。热词列表里频繁出现的content://com.baidu.searchbox.fileprovider/...和content://com.ss.android.uri.key/...就是典型的FileProvider授权路径,理解了这个结构,也就理解了ContentProvider的实际应用场景。
2.2 Handler消息机制与异步任务
Handler消息机制是Android笔试的“钉子户”,几乎100%会出现。它的核心组件包括Handler、Looper、MessageQueue和Message。Looper负责循环取消息,MessageQueue是消息队列,Handler负责发送和处理消息。整个机制的关键在于Looper.loop()这个死循环,它不断从MessageQueue中取消息,如果没有消息就阻塞等待,这就是主线程不会因为Handler机制而卡死的原因。
笔试中经常出现的坑点是“为什么主线程的Looper不需要手动创建”。答案是在ActivityThread的main方法中系统已经调用了Looper.prepareMainLooper(),所以应用代码中可以直接new Handler()。而子线程中创建Handler之前必须先调用Looper.prepare(),再调用Looper.loop(),否则会抛出RuntimeException: Can't create handler inside thread that has not called Looper.prepare()。这个异常信息建议记住原文,面试时直接背出来会显得对原理很熟悉。
另一个高频考点是Handler导致的内存泄漏。非静态内部类的Handler会持有外部Activity的引用,如果MessageQueue中还有未处理的消息,Activity就无法被回收。标准解法是把Handler声明为静态内部类,使用WeakReference引用Activity,并在onDestroy中移除所有回调。这套解法既能出现在简答题里,也能作为选择题的选项。
2.3 自定义View与绘制流程
自定义View也是笔试的重点,考察的核心是measure、layout、draw三大流程。onMeasure决定View的大小,onLayout决定子View的位置,onDraw决定绘制的内容。对于自定义ViewGroup,需要重写onMeasure和onLayout;对于自定义View,通常只需要重写onDraw。
笔试中常见的一道题是“MeasureSpec的三种模式分别是什么”。UNSPECIFIED表示父容器对子View没有限制,EXACTLY表示父容器已经确定子View的大小,AT_MOST表示子View最大不能超过某个值。测量时子View的MeasureSpec是由父View的MeasureSpec和子View的LayoutParams共同决定的,这个联动关系经常会作为选择题的选项出现。比如在ScrollView中嵌套RecyclerView时,因为父容器是UNSPECIFIED模式,RecyclerView的高度测量会变得不可控,这也是为什么很多人会遇到“RecyclerView只显示一屏”的问题。
关于View的绘制顺序,有一个容易被忽略的细节:在onDraw中做耗时操作会导致掉帧,因为绘制流程是在主线程执行的。自Android 3.0起硬件加速默认开启,但这并不意味着onDraw中可以随意做复杂计算。笔试如果问“如何优化自定义View的绘制”,最标准的回答是避免在onDraw中创建对象、避免执行耗时逻辑、使用invalidate的脏区域刷新,而不是直接调用invalidate全量重绘。
2.4 性能优化与内存管理
性能优化部分,内存泄漏是最高频的考点。常见场景包括Handler持有Activity、静态变量持有Activity或View、单例持有Context、匿名内部类持有外部类引用、资源未关闭等等。笔试一般会让你列举哪些场景会导致内存泄漏,或者给出一个代码片段让你找出问题。解决内存泄漏的工具也常考:LeakCanary用于检测泄漏,Android Studio自带的Profiler可以分析堆内存和CPU占用,而JProfile这类工具虽然功能强大,但校招生了解即可。
ANR也是一个经典考点,产生ANR的四种情况需要背清楚:输入事件5秒内未处理完成、BroadcastReceiver的onReceive 10秒内未执行完、Service的onCreate等生命周期20秒内未完成,以及前台Service 20秒内没处理完。这里有一个很容易踩的坑——很多人以为只在子线程里做耗时操作就够了,但后台线程如果数量过多或者优先级设置不当,同样会影响主线程的消息处理,导致ANR。
内存优化中,SparseArray和ArrayMap取代HashMap的场景也经常出现在选择题里。它们比HashMap更省内存,因为避免了HashMap的自动装箱和哈希表结构的开销。但要注意,SparseArray只能用于key为int或long的场景,如果key是String,还是得用HashMap。顺便一提,Android开发中推荐使用android.util.SparseArray而不是android.util.LongSparseArray,前者API更早可用。
3. 实战真题解析——从题干看考点
3.1 经典选择题:一个误区带出的知识盲区
我举个例子,这套试卷里有一道印象很深的题:“以下哪个选项不会导致Activity内存泄漏”。选项分别是:A. 静态变量持有Activity引用,B. 非静态内部类Handler持有Activity引用,C. Activity的onDestroy中未反注册BroadcastReceiver,D. Activity中创建的线程在onDestroy后仍在运行。
这道题的陷阱在于选项D。很多人觉得线程还在运行就一定会导致泄漏,其实不一定。如果线程是静态的或者是全局单例,它不持有Activity的强引用,那就不算泄漏。但如果这个线程是一个以匿名内部类形式创建的,它隐式持有外部Activity的引用,那就会泄漏。所以严格来说,D选项并不是“一定”会导致泄漏的选项。这道题考察的其实是对“强引用”这个概念的理解,而不只是对泄漏场景的机械记忆。
再说一道印象中与RecyclerView相关的选择题:“关于RecyclerView,下列说法正确的是”。正确的选项是“RecyclerView通过ViewHolder模式实现复用,复用机制由RecyclerPool管理”。错误选项包括“Item添加动画一定会导致性能下降”“LayoutManager必须自定义才能实现横向列表”“RecyclerView嵌套在ScrollView中时高度可以自动测量”。这题考的是RecyclerView的基本认知和嵌套使用的坑。RecyclerView嵌套ScrollView时高度测量问题非常经典,正确解法是重写LayoutManager的canScrollVertically返回false或者使用NestedScrollView替代ScrollView,但这个方案本身的性能消耗比较大,一般不建议直接套用。
3.2 简答题的答题思路:从结论到原理
简答题部分,典型题目有“简述Handler机制的原理”“如何解决ListView滑动卡顿的问题”“进程间通信有哪几种方式,各自的应用场景是什么”。
答题思路非常重要,笔试的简答题阅卷通常按点给分,你需要先写结论,再写原理,最后补充细节。以“Handler机制原理”为例,我的回答方式是:“Handler机制是Android中线程间通信的核心方案,主要由Handler、Looper、MessageQueue和Message四个组件构成。Looper在目标线程中通过loop方法循环取消息,Handler通过sendMessage方法将Message放入MessageQueue,消息被Looper取出后回调Handler的handleMessage方法,从而实现在目标线程中处理消息。主线程启动时系统创建了主Looper,因此主线程中可以直接使用Handler;子线程需要手动调用Looper.prepare和Looper.loop。”
关于“进程间通信方式”,需要列举Binder、Socket、共享文件、ContentProvider和Messenger。Binder是最常用的,性能高且支持安全校验,广泛用于系统服务和跨进程调用;ContentProvider是系统层面的进程间数据共享标准;Messenger基于Binder封装,适合单线程消息传递;共享文件适合简单数据同步,但并发读取时存在一致性问题;Socket适合跨设备或跨平台的通信,但开销较大。答题时如果能提到“Binder底层基于内核的mmap机制实现一次拷贝”,会让面试官觉得你确实理解过,而不只是背了概念。
3.3 手写算法题与代码规范
编程题部分,通常会考1至2道,难度介于LeetCode的Easy和Medium之间。出现频率较高的题目包括“链表反转”“判断链表是否有环”“二叉树层序遍历”“两个线程交替打印1到100”“字符串中的第一个唯一字符”。这些题本身不偏不怪,关键是在笔试中能否快速写对。
以“两个线程交替打印1到100”为例,这题考察的是线程协作和锁的使用。用synchronized + wait/notify或者ReentrantLock + Condition都可以实现。写法上需要注意两点:第一,两个线程共享一个对象锁,打印后调用wait()释放锁;第二,需要设置标志位来决定当前该哪个线程打印,防止虚假唤醒。很多人一紧张就忘了wait必须在synchronized代码块内调用,或者忘了用try-catch包围InterruptedException,这些都是阅卷时能一眼看出的规范问题。
另一个容易被忽视的问题是边界条件。比如反转链表,题目一般不会直接告诉你有几个节点,但你写的代码需要正确处理空链表和单节点的情况。笔试题的测试用例通常包括空输入、最小值、最大值等边界情况,代码里缺少边界判断会被扣除不少分数。我自己的习惯是主干逻辑写完后,立刻补上兜底判断:入参为null时返回什么,输入长度为0时返回什么,数字溢出时如何处理。
4. 试卷失分点复盘与复习路线建议
4.1 答题顺序与时间分配的实战经验
我在模拟这套试卷时总结出的时间分配方案是:选择题和判断题控制在30到40分钟,这部分基本是概念题,会就是会,不会也不要死磕;简答题控制在20到25分钟,每题写个三四条要点就够了,不用写成小论文;编程题留30到40分钟,先读清题目,再动手写。
很多人在笔试中最大的错误,是在多选题上反复纠结。多选的计分规则是“少选不得分、错选不得分”,因此不确定的选项宁可不选。比如一道题问“下列哪些属于Activity的启动模式”,如果你只确定standard和singleTop,那就不选singleTask和singleInstance,即使最后漏选丢了分,也好过错选直接归零。同理,问“哪些情况会导致ANR”,不确定的选项不要勾。
另外一个实战细节:编程题不要一上来就写最优解,先写能跑通的暴力解法,再逐步优化。很多线上笔试系统是按测试用例给分的,一个不完整的“最优解”可能只通过60%的用例,而暴力解反而能拿满基础分。优化到AC再回头精修代码,是性价比最高的策略。
4.2 结合项目的复习方法
笔试的考点和项目实践是重叠的,建议以项目作为复习的锚点,而不是脱离项目去死磕八股文。比如项目中用到了Retrofit,就顺藤摸瓜去复习OkHttp的拦截器原理;用到了Glide加载图片,就去搞清楚它的三级缓存和生命周期绑定机制;用到了LiveData和ViewModel,就把生命周期感知的原理搞明白。
热词列表里频繁出现“android framework”“android ams”“android ota”,说明现在很多公司对Framework层的要求在提高。校招笔试虽然不会直接考AMS的源码级别,但掌握基本的系统服务调用链路是有必要的。比如“点击一次App图标,从Launcher到Activity显示的完整流程”,这类题目时常作为加分项出现。核心链路是Launcher通过Binder调用AMS的startActivity方法,AMS经过进程调度和ActivityStack的管理后,通过ApplicationThread回调到App进程中,最终执行Activity的onCreate。能把这套流程讲清楚的候选人,在面试中一定能让面试官眼前一亮。
4.3 不需要死记硬背的知识点
笔试虽然有大量记忆型题目,但有一些内容我不建议花太多时间去背。比如具体的抽屉布局的控件属性、某个第三方库的最新版本号、Android Studio的快捷键,这些内容在真实开发中都是随时可以查到的,笔试考察的意义不大。热词列表里出现的“android studio怎么用ai”“android studio汉化”这类问题,属于工具层面的操作,不会出现在正式的笔试考卷中。
但基础的数据结构和算法,我强烈建议不要临时抱佛脚。大厂的笔试环节算法题的比重在逐年提升,好的算法功底决定了你能否在有限时间内完成题目。面试前最好把LeetCode Hot 100里的题目刷一遍,重点是数组、链表、二叉树、哈希表、栈和队列、动态规划这几类题型。不要只刷自己擅长的类型,笔试出题者不会按照你的偏好出题。
5. 面试准备与简历自查清单
5.1 简历中的“熟悉”与“了解”要慎用
笔试通过之后,面试官通常会拿着你的简历逐个核对技术栈。简历上写“熟悉Handler机制”,就要做好被追问Handler的源码细节的准备;写“熟悉事件分发机制”,就要能完整画出dispatchTouchEvent和onInterceptTouchEvent的调用链;写“熟悉RecyclerView”,就要能说出四级缓存分别是哪些、各自的作用范围是什么。简历上的每个词都应该是你真正掌握的,否则面试官三连问就会露馅。
对于Android岗位,简历的编写原则是“项目经历用数据说话”。不要只写“负责开发资讯类App”,而要写“负责资讯类App的首页Feed流模块,基于RecyclerView实现多类型Item展示,通过预加载和图片压缩将首屏加载时间从1200ms优化到600ms”。有数据、有技术、有成果,比空泛的描述有说服力得多。
5.2 高频面试题的延伸准备
笔试通过后还会面临一轮技术面试,很多面试题其实是笔试题的延伸和深化。比如笔试考了Handler和Looper的关系,面试就可能让你手写一个简单的Handler模型;笔试考了Activity四种启动模式的名词解释,面试就可能出一道“在一个singleTask模式的Activity中,从外部再次启动这个Activity,它的onNewIntent会被回调,此时生命周期怎么走”的场景题。
这类延伸问题没法靠背诵解决,需要真正理解原理。我的建议是在笔试复习过程中,每掌握一个知识点就试着追问三个“为什么”。比如:为什么ContentProvider的onCreate先于Application的onCreate执行?为什么Binder只需要一次拷贝就能完成数据传递?为什么Activity的onDestroy只调用一次,但onPause可能调用多次?带着这些问题去翻源码、看博客、做实验,面试时自然就有了自己的理解。
5.3 面试中的表达与节奏控制
最后想提一点:技术表达能力和代码能力同样重要。笔试的简答题是静态的,面试则是动态的切磋,面试官抛出一个问题后,你不仅要给答案,还要在回答中传递出自信与条理。建议养成“先说结论,再展开原理,最后补充场景”的表达习惯。
举个例子,面试官问:“HashMap和Hashtable有什么区别?”如果只回答“一个线程安全一个线程不安全”,那就太单薄了。但如果你补充说“HashMap在JDK 7及以前会死循环,JDK 8改成了尾插法解决了这个问题”,面试官就会觉得你不仅看过相关文章,还动手验证过。再比如“ARCore应用在Android端的兼容性问题”——能结合自己在项目中做过的机型适配来讲,远比背诵文档里的兼容性列表更有感染力。
6. 那些年笔试中容易踩的坑
6.1 概念混淆类错误
Android笔试中有一些概念极其相似,很容易踩坑。比如“启动模式”和“任务栈”的关系,很多人背了四种模式,却说不清TaskAffinity的作用。singleTask配合TaskAffinity使用时,会在指定任务栈中寻找是否已有实例,这一点选择题经常考。
再比如“内存溢出”和“内存泄漏”的关系。内存泄漏是指对象无法被GC回收,持续累积最终导致内存溢出;内存溢出是内存不够用,可能由泄漏引起,也可能是单次峰值占用过高。这个区别在简答题里经常被考察,最好用自己的话把两者的因果关系讲清楚,而不是直接背定义。
还有“Serializable”和“Parcelable”的对比。Intent传递对象时两者都可用,但Parcelable是为Android专门设计的,性能更好,是官方推荐方案。具体来说,Parcelable的读写主要发生在内存中,而Serializable基于IO流,反射调用较多,因此效率差距非常明显。笔试选择题经常会把两者放在一起考效率对比。
6.2 框架层与应用层混用
校招生常见的问题是把第三方框架的API当成Android本身的API,比如把OkHttp的错误说成“Android网络请求报错”。笔试和面试中,要养成区分“Android系统能力”和“第三方框架能力”的习惯。比如网络操作本身,Android只提供HttpURLConnection和底层Socket能力,OkHttp和Retrofit是第三方封装库;图片加载同样如此,Android原生没有Glide,只有BitmapFactory和ImageDecoder。
我在模拟这套试卷的时候,发现很多选择题只要区分了“哪部分属于Framework、哪部分属于SDK、哪部分属于第三方框架”,就能迅速排除一半的选项。这个意识,建议大家从笔试前就开始刻意培养。
6.3 只背结论不追根因
最后这个坑,我多说几句,因为它影响的不只是笔试,而是整个职业发展。很多人复习Android面试喜欢背题,背“Activity启动模式有四种”“内存泄漏的常见场景有五种”“RecyclerView比ListView强在哪”,背得滚瓜烂熟,但一遇到变化性的问题就懵了。
比如笔试中如果问你“在启动模式为singleTask的Activity A中,连续两次通过Intent启动A,onCreate会被执行几次”,答案是一次,后续启动只走onNewIntent。但如果问“如果A的taskAffinity与默认不同,且启动Intent中包含FLAG_ACTIVITY_NEW_TASK标志,会怎样”时,很多人就会卡住。核心原因是只背了结论,没有理解任务栈的调度逻辑。
要解决这个问题,最快的路径是看源码。Android的源码虽然庞大,但启动流程、消息队列、View绘制这些核心路径是可以找到视频讲解和推荐文章逐行拆解的。结合自己的项目和调试工具,把一个核心机制彻底搞清楚,要比浮光掠影地了解十个知识点有用得多。
7. 给不同阶段读者的具体建议
7.1 对正在春招的校招生
如果你现在正处于春招的冲刺阶段,时间已经很紧了,整个知识体系的复习策略需要按“价值密度”来排序。先把Handler、四大组件、自定义View、事件分发、性能优化这几块吃透,这是面试官最常问也是最能拉分的部分。然后是Java基础和数据结构,这是笔试的保底分。最后是网络、操作系统和设计模式,这部分性价比相对低,但也不能完全裸考。
笔试前一定要做几套模拟卷。不用找机构和培训班的所谓“押题卷”——那些往往是二手资料,更建议直接刷近几年的各个大厂校招真题。做完之后不要只对答案就完事,每一道错题都要记录错因、对照原文知识、写一份自己的解析,很多人的复习效率低,就是因为错题从来没形成错题报告。错题的这个环节,我建议至少留出两周时间。
7.2 对工作一两年想换赛道的开发
看起来这是针对校招的文章,但如果你已经工作了一两年,想跳槽去更大的平台,这套试卷依然有参考价值。工作带来的项目经验在面试中占据重要位置,但Android的基础知识同样会被考察。只是考察方式不再停留在概念上,而会直接问“你在项目里怎么解决这个问题”。
比如笔试考了内存泄漏,面试就会追问“你们团队线上是怎么发现内存泄漏的,如何定位”。如果你只能在简历上写“熟悉常见的性能优化方案”,却拿不出真实的案例,面试效果会大打折扣。我的建议是,在准备跳槽前,先把手头的项目翻一遍,复盘自己做过的性能优化、架构演进和踩坑修复,整理成一条条可以讲3分钟的完整故事。
7.3 对Android新人的入门路线
如果你是刚接触Android,还不着急找工作,那这份试卷给你最大的价值是一份清晰的“方向地图”。不需要现在去啃源码,也不需要硬背那些选择题陷阱,先按《第一行代码》的顺序把基础组件、常用控件、数据存储、网络请求这些内容学一遍,然后找一个完整项目亲手从零写一遍。
在写项目的过程中,你会自然碰到很多“异常”情况——为什么异步加载图片时ListView滑动会卡顿,为什么屏幕旋转后Activity数据丢了,为什么深色背景上黑色文字看不清。把这些“为什么”都记下来,再对应到相关知识点的复习中,你的Android学习之路就走得非常扎实了。
8. 从笔试到入职:一份个人体会
写了这么多,最后说点掏心窝的话。这套京东2019春招Android开发类试卷,表面上是一份校招笔试题,实质上是一面镜子,照出了你过去几年技术积累的深浅。笔试的每一道题都不会白做,它们在筛选候选人的同时,也在帮你理解这个行业需要什么样的能力。
我在自己带实习生的过程中发现,真正能通过校招笔试并留下来转正的,往往不是学校背景最好的那一批,而是那些愿意沉下心把原理搞明白的人。同样是背Handler,有人只记住了使用方式,有人在面试时会画出手绘的消息循环流程图,后者的机会一定会更多。
如果你现在正在刷题,给自己定一个目标:每天理解一个核心知识点,而不是盲目地背十道题。把“为什么”想通了,把“怎么做”的代码写顺了,比任何押题都有效。希望这篇复盘能给你一些复习思路上的启发,也欢迎在评论区聊聊你遇到的那些让人印象深刻的Android笔试题。