ARTICLE DETAIL

资讯详情

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

360春招Android笔试客观题全解析:高频考点与避坑指南

360春招Android笔试客观题全解析:高频考点与避坑指南 又到春招季翻出硬盘里存的这份360公司2018春招Android开发工程师笔试客观题合集重新过了一遍。说实话这算是我当年刷过的印象最深的一套题也是性价比极高的一套自测材料。虽然年份有点久了但Android客观题考的东西从来不是什么花架子四大组件、Handler、Java集合、进程优先级、排序算法复杂度这些基础玩意儿到现在依然是面试必问。如果你正在准备Android岗位的校招或者跳槽拿这套题来摸底比自己漫无目的地翻书要高效得多。这套题覆盖范围很杂Java、Android、数据结构、计算机网络、操作系统都有涉及整体难度属于“基础扎实就能过基础不牢就翻车”的类型。它的价值不在于押中多少原题而在于帮你把Android开发的知识体系完整地过一遍。本篇我按照这套题涉及的知识模块把高频考点、典型题目和做题时容易踩的坑全部拆开讲一遍顺便附上我的解题思路和复盘方法希望能对正在刷题的你有点实际帮助。1. 360春招Android笔试客观题的出题思路与结构拆解先说整体印象。360这份客观题合集题量不小知识点覆盖面非常广几乎是把大学四年计算机基础课加上Android开发的核心知识全部浓缩进了一张卷子。我当时做的时候最大的感受是时间紧张多选题很折磨。它的单选题大概二十道左右多选题十道上下再加上一些判断和填空形式的变化客观题整体控制在60分钟左右做完是比较理想的节奏。如果你在某几道题上死磕后面就会很被动。1.1 从题目结构反推考察意图我发现这类笔试有非常明确的筛选逻辑。三个核心方向语言基础、系统机制、算法与计算机通用知识。第一块语言基础重点在Java。集合框架的源码级理解、并发与线程安全、JVM内存模型、String/包装类的细节几乎每年必考。第二块系统机制Android四大组件、Handler消息机制、View事件分发、进程与线程、性能优化这些属于Android岗的“专业必修课”比重最大。第三块就是通用计算机基础数据结构里的HashMap/HashTable、二叉树遍历、排序算法时间复杂度和稳定性计算机网络里的TCP/UDP、HTTP状态码操作系统里的进程调度、死锁、内存管理。这套题难就难在知识面太宽很多科班出身的同学可能Android部分没问题却在Java集合或网络协议上掉了链子。复习的时候一定要对照着自己的薄弱点去补不要只抱着《Android开发艺术探索》啃计算机基础同样能拉开分数。1.2 判断题与多选题的“一票否决”逻辑大厂笔试的多选题基本都采用“多选、少选、错选都不得分”的规则360这份也不例外。这意味着你不能用排除法蒙答案必须把每个选项都搞清楚。我吃过一个亏一道关于Activity启动模式的多选题有个选项说“singleTop模式下如果栈顶已经是该Activity的实例再次启动会回调onNewIntent而且不会走onCreate”。我当时觉得这个描述没问题选了它。但正确答案其实更严格singleTop只有在目标任务栈的栈顶是同一个实例时才触发复用如果不是栈顶系统会新建实例而不是复用旧实例。那个选项因为没有强调“栈顶”这个前提条件严格来说是有漏洞的。这种抠字眼的题目就是客观题最阴的地方。做题的时候每个字都要仔细读选项给出的场景描述越具体越要留心。2. Java核心考点从语法细节到JVM底层Java部分占比很重而且考得很细。我复盘了近几年的题库发现360特别爱考这几个方向字符串与包装类的“陷阱”、集合框架源码、线程与并发、JVM内存管理。下面逐个拆解。2.1 String、StringBuilder、StringBuffer与常量池有一道题是String s1 abc; String s2 new String(abc);问s1 s2的结果以及intern()方法的用途。这个考点几乎是Java客观题标配。s1指向常量池中的abcs2指向堆内存中的String对象两者地址不同所以比较的是引用地址结果为false。如果执行String s3 s2.intern();当常量池中已有abc时s3会直接指向常量池里已有的abc所以s1 s3为true。这里有个容易忽略的细节String s new String(abc)到底创建了几个对象答案是如果常量池中还没有abc则创建两个对象一个在堆中一个在常量池中如果常量池已有abc就只创建一个堆对象。很多同学在这道题上出错是因为默认“new一定创建一个对象”而忽略了常量池的同步创建。至于StringBuffer和StringBuilder的区别就是线程安全对比性能StringBuffer的方法加了synchronized线程安全但性能略低StringBuilder非线程安全性能更高。单线程字符串拼接优先用StringBuilder多线程共享可变字符串才用StringBuffer。这个考点客观题喜欢放到多线程上下文里考。2.2 集合框架HashMap源码级理解HashMap在Java笔试中的地位稳坐头把交椅。重点考察JDK1.8之后的实现数组链表红黑树以及扩容机制、put流程、hash碰撞处理。常考的一个题HashMap的默认初始容量是16负载因子是0.75什么时候触发扩容答案是size threshold时而threshold capacity * loadFactor即元素个数超过当前容量乘以0.75时容量扩大为原来的2倍。注意这里的size是HashMap中已有键值对的数量不是数组已占用位置的数量这个区别很多人搞混。再考一个put流程计算hash(key)定位到数组下标如果该位置为空直接放入如果不为空遍历链表或红黑树比较key值存在则覆盖旧值不存在则尾插新节点。链表长度超过8且数组长度大于等于64时链表转红黑树红黑树节点数少于6时退化为链表。数字8和6设计成了一对缓冲阈值避免频繁转换。这些数字如果记不牢很容易在多选题里被类似的数值选项迷惑。我的记忆方法是8是“树化阈值”6是“退化阈值”中间留出空间是为了避免链表和红黑树在临界点反复横跳。HashMap线程不安全这一点也是必考。多线程put可能导致数据覆盖还可能在扩容时形成环形链表JDK1.7的头插法时代。替代方案HashTable全表加锁性能差ConcurrentHashMap用CASsynchronized保证线程安全读操作无锁性能更好。Collections.synchronizedMap也能包装成同步Map但本质上仍是全表锁。2.3 线程与并发synchronized、volatile与线程池客观题里Java多线程部分一般有两到三道。锁相关的考点很集中synchronized修饰静态方法和修饰实例方法的区别。修饰静态方法锁的是Class对象修饰实例方法锁的是当前实例对象两者不是同一个锁不能互斥。修饰代码块时锁对象由括号指定可以是this也可以是某个专门的锁对象比如private final Object lock new Object()。volatile是高频点。它保证可见性禁止指令重排但不保证原子性。这个特性组合经常出现在多选题里。比如给出一个场景两个线程同时对一个volatile int count执行count问结果是否一定正确。答案是否定的因为count是“读-改-写”三步不是原子操作volatile只能保证读的时候拿到最新值无法保证多线程并发修改不冲突。正确做法是用AtomicInteger的getAndIncrement()或者给方法加synchronized。线程池的考察点集中在ThreadPoolExecutor的核心参数核心线程数、最大线程数、空闲线程存活时间、任务队列、拒绝策略。问什么情况下会创建非核心线程答案是任务队列满且当前线程数小于最大线程数时。拒绝策略有四种AbortPolicy抛异常、CallerRunsPolicy调用者线程执行、DiscardPolicy丢弃、DiscardOldestPolicy丢弃最旧的未处理任务。默认是AbortPolicy网上很多资料默认策略是丢弃其实是错的。2.4 JVM内存结构与类加载机制JVM部分题量不大但逢笔试必有。常见考法列出几个区域问哪个是线程私有、哪个是线程共享。线程私有的虚拟机栈、本地方法栈、程序计数器线程共享的堆、方法区Java 8之后是元空间。还有一道常考题OutOfMemoryError在哪些区域会发生堆内存不足抛OutOfMemoryError元空间不足也会抛虚拟机栈内存不足抛StackOverflowError。这个区分很多人在StackOverflowError和OutOfMemoryError之间模糊其实记住栈深不够是StackOverflowError申请不到内存是OutOfMemoryError就够了。类加载机制也偶尔考双亲委派模型。提到loadClass时先请父类加载器尝试加载父类加载不了才自己加载。好处是避免类被重复加载也防止核心API被篡改。常见问法能不能自己写一个java.lang.String并在应用中加载答案是能编译但不能被加载因为引导类加载器会优先加载JDK自带的String自定义的同名类根本走不到应用类加载器那一层。3. Android核心机制四大组件、Handler、View与性能优化Android部分是整套题的大头也是最容易拉开分差的模块。Android知识掌握得扎实不扎实从这部分正确率基本就能看出来。3.1 Activity生命周期与启动模式Activity的启动模式在客观题里出现频率极高。四种模式standard、singleTop、singleTask、singleInstance。它们各自的启动行为必须滚瓜烂熟。singleTop的触发条件是“目标任务栈栈顶已有该Activity实例”注意必须是栈顶否则新建实例。singleTask会查找整个系统里是否存在该Activity的任务栈如果存在就将该Activity之上的所有Activity出栈并回调onNewIntent。singleInstance更特殊单独占用一个任务栈适合需要全局唯一且独立于其他页面跳转的场景比如来电界面。有一个我见过多次的变体一个singleTop的ActivityA位于栈底上面压着ActivityB此时又启动ActivityA问会走哪些回调。正确路径是Task栈中不存在复用条件A不位于栈顶所以系统会创建一个新的A实例完整走onCreate → onStart → onResume。很多人看到singleTop就条件反射地选onNewIntent结果答错。细节决定分数。onSaveInstanceState和onRestoreInstanceState也是必考内容。系统可能随时因内存不足回收后台Activity此时Activity会走onSaveInstanceState保存状态。具体时机从A启动BA如果被回收状态会在A的onStop之前由系统保存。恢复时onRestoreInstanceState在onStart之后回调。记住如果是你自己主动按返回键退出Activity是不会走onSaveInstanceState的因为没有“销毁保护”的必要。3.2 Service两种启动方式与进程优先级Service的bindService和startService区别属于基本功。startService启动的Service与启动者无关即使启动它的组件退出了Service仍可继续运行。bindService创建的服务与绑定者绑定所有绑定者解绑后如果没有通过startService启动过Service会被销毁。还有一道关于Service多次点击“开始”按钮的题第一次startService走onCreate → onStartCommand后续再点击只走onStartCommand不再走onCreate。如果点击“停止”onDestroy会被调用再次启动则重新经历onCreate → onStartCommand。进程优先级在Android中分为五级从高到低前台进程、可见进程、服务进程、后台进程、空进程。Service运行会使进程处于服务进程优先级高于后台进程这是Service能“保活”的基础。题目里常问哪些场景属于前台进程答案是拥有正在与用户交互的Activity、持有前台Service、拥有广播接收器正在执行onReceive。注意被系统判定为前台进程的理论上不会被系统优先杀死。3.3 Handler消息机制与内存泄漏Handler机制的考点集中在Looper、MessageQueue、Message、Handler四者关系。主线程默认有Looper通过Looper.loop()开启消息循环取消息、分发消息。子线程要使用Handler时必须先调用Looper.prepare()创建Looper再Looper.loop()。没有prepare就new Handler会直接抛RuntimeException。Handler造成的内存泄漏是必考中的必考。非静态内部类Handler默认持有外部Activity的引用如果Handler中放了一个延迟消息而用户在消息触发前关闭了Activity这个延迟消息就会一直持有Activity引用导致Activity无法被回收。解决办法使用静态内部类WeakReference弱引用持有Activity同时在onDestroy中移除所有消息removeCallbacksAndMessages(null)。我整理简化的记忆点场景是否泄漏原因延时消息未处理完Activity销毁会泄漏消息持有HandlerHandler持有Activity非静态内部类Runnable作为匿名内部类会泄漏Runnable持有外部类引用onDestroy中removeCallbacksAndMessages(null)不泄漏移除所有消息切断引用链3.4 自定义View与事件分发机制View相关的客观题也不少。事件分发要记牢三个方法dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。一个事件从Activity到ViewGroup再到View的传递顺序是Activity.dispatchTouchEvent → ViewGroup.dispatchTouchEvent → ViewGroup.onInterceptTouchEvent → View.dispatchTouchEvent → View.onTouchEvent。如果View的onTouchEvent返回false事件会向上回传给ViewGroup的onTouchEvent。有个经典判断题onTouchListener和onTouchEvent谁先执行答案是onTouchListener优先。onTouchEvent在dispatchTouchEvent中执行时会先判断是否设置了OnTouchListener如果onTouch返回true就直接消费事件不再执行view自身的onTouchEvent。这个顺序常以“设置OnClickListener之后走performClick是在什么时候”的形式出现是在onTouchEvent的ACTION_UP中如果事件被消费则调用。自定义View的invalidate()和requestLayout()区别也被反复考invalidate触发onDraw重绘requestLayout触发onMeasure和onLayout重新测量布局。两者不能互相替代。3.5 性能优化与内存优化性能优化相关题目360喜欢结合实际场景。比如问App卡顿应该优先排查哪些方向常见答案有主线程是否有耗时操作、是否存在过度绘制、布局层级是否过深、是否存在内存抖动导致频繁GC。这题其实很难选错但多选题要求选全。内存泄漏排查是高频题。问哪个工具可以检测内存泄漏答案是LeakCanary。问下列哪些操作可能导致内存泄漏常见的有Handler持有Activity、静态变量持有Context、未注销BroadcastReceiver、未关闭Cursor、单例持有Activity引用。这些场景在多选题里经常组合出现选出所有正确项。Bitmap相关的题也经常出现。问避免Bitmap引起OOM的做法有哪些选项常见使用inSampleSize采样压缩、使用BitmapFactory.Options.inJustDecodeBounds读取宽高、用LruCache做内存缓存、使用recycle()及时释放。注意inJustDecodeBounds只是读取图片边界信息不加载像素数据用于先测量再决定采样率。4. 数据结构、计算机网络与操作系统客观题速通这部分虽然不直接涉及Android但笔试里占比不低。360的客观题特别爱考算法复杂度、排序稳定性、TCP/UDP区别、HTTP状态码以及操作系统里的死锁条件。如果时间有限优先掌握下面这些。4.1 排序算法的时间复杂度与稳定性排序算法几乎是每年必考。直接给一张速查表对照记忆排序算法平均时间复杂度最坏时间复杂度是否稳定额外空间冒泡排序O(n²)O(n²)稳定O(1)选择排序O(n²)O(n²)不稳定O(1)插入排序O(n²)O(n²)稳定O(1)快速排序O(n log n)O(n²)不稳定O(log n)归并排序O(n log n)O(n log n)稳定O(n)堆排序O(n log n)O(n log n)不稳定O(1)记忆稳定性的技巧简单排序里只有“相邻比较并交换”的冒泡和插入是稳定的选择排序不稳定是因为它可能会把相同元素的相对位置打乱。扩展一下快速排序不稳定最坏情况发生在每次划分都极度不平衡时比如输入序列已经有序且每次都选第一个元素作为基准这时复杂度退化为O(n²)。堆排序的建堆过程会把相同值的元素来回移动所以也不稳定。问算法空间复杂度时归并排序的O(n)额外空间是最容易和快排混淆的快排是O(log n)。这两个数字记准确。4.2 HashMap、红黑树与二叉树的遍历数据结构部分HashMap的实现细节我在前面Java部分已经讲过了笔试里这里也经常以独立题出现。比如问“负载因子是0.75初始容量16扩容后容量是多少”答32扩容是2倍。同样要清楚HashSet底层是HashMap只是value统一为一个固定Object对象。二叉树遍历是另一个高频考点。前序遍历根左右、中序遍历左根右、后序遍历左右根、层序遍历。常见考法给出一棵树的形状问后序遍历的顺序。还曾经见过一道真题已知前序遍历是A-B-D-E-C-F中序遍历是D-B-E-A-C-F求后序遍历。先根据前序确定根是A然后以A为界分割中序遍历左子树为D-B-E右子树为C-F再递归往下推后序结果是D-E-B-F-C-A。这类题一定要自己动手推一遍光看解析记不住。红黑树在Android里因为HashMap用过所以偶尔考。它的性质每个节点是红色或黑色根是黑色叶子NIL是黑色红色节点的两个子节点必须是黑色不能出现连续红色任一节点到其每个叶子的路径上黑色节点数相同。它的插入和删除复杂度都是O(log n)。普通客观题考概念不会让你手撕红黑树旋转。4.3 计算机网络TCP三次握手与HTTP状态码网络部分TCP和UDP是经典考点。一个常考题TCP建立连接需要几次握手答案是三次。为什么是三次而不是两次一个通俗的解释是三次握手能防止失效的连接请求突然又到达服务端导致服务端白白建立连接。客户端发出的SYN报文如果因为网络延迟而滞留客户端会超时重发。第一次连接请求已经失效如果只有两次握手服务端收到第一次SYN可能以为客户端要建立连接既浪费了资源又可能在恢复后错误建立连接。三次握手让服务端能确认“客户端确实是想建立当前这个连接”。UDP和TCP的区别典型问法哪些场景适合用UDP答案是实时音视频、在线游戏、DNS查询。因为UDP不保证可靠性但延迟低。TCP是面向连接的、可靠的、基于字节流的适合文件传输、邮件、网页等。HTTP状态码也是送分题200成功、301永久重定向、302临时重定向、400请求语法错误、403服务器拒绝请求、404资源不存在、500服务器内部错误、502网关错误、503服务不可用。有一年考过“301和302的区别”简述为301是永久重定向搜索引擎会更新链接权重302是临时重定向搜索引擎保留原链接。这个语义在网页开发里尤其重要容易被忽略。4.4 操作系统死锁、进程调度与Linux基础操作系统部分死锁的四个必要条件互斥、占有并等待、非抢占、循环等待。破坏任何一个条件就能预防死锁。做题时看到“资源分配图中有环”答案选项里有“死锁可能发生”要小心有环不一定死锁但死锁一定有环。有很多题目就利用这个概念做文章。进程和线程的区别进程是资源分配的基本单位线程是CPU调度的基本单位。同一进程的多个线程共享进程的地址空间但各有独立的栈和寄存器上下文。线程切换的开销小于进程切换因为切换进程中需要切换地址空间页表而线程共享地址空间。Android脱不开Linux内核所以偶尔会考一下Linux命令。比如列出当前目录下所有文件的命令是ls查找进程是ps查看端口占用netstat杀掉进程kill。这些基础命令不复杂但如果备考时间紧张没有复习到考场上见到还是会卡壳。5. 高频笔试题与避坑指南我踩过的那些坑这部分我整理了刷题过程中最容易出错的几类题结合我自己的踩坑经历给大家做一次“排雷”。每道题我都标了解析思路建议先自己思考再看答案。5.1 Activity启动模式的多选题陷阱题目关于Activity的singleTask启动模式下列说法正确的是A. singleTask模式下的Activity在其任务栈中只能存在一个实例。 B. 启动singleTask的Activity时如果栈中已有该实例则会将该Activity之上所有Activity清空并回调其onNewIntent。 C. singleTask模式下每次启动都会创建新实例。 D. singleTask与singleInstance的区别在于singleInstance会为新Activity创建新的任务栈。正确答案ABD。C是典型的绝对化错误。后台时如果Activity已被系统回收再次启动会重新创建实例不是“每次启动都创建新实例”这种绝对说法。B的细节栈顶Activity之上所有Activity出栈也就是onActivityResult的“clearTop”效果。另外注意singleInstance的Activity是独占一个任务栈且该栈中只有它一个实例这是它和singleTask最大的区别。5.2 Handler内存泄漏的正确解法题目以下哪些做法能避免Handler造成的内存泄漏A. 使用静态内部类Handler并通过弱引用持有Activity。 B. 在onDestroy中调用removeCallbacksAndMessages(null)。 C. Handler中持有Activity强引用但消息只有普通短延迟。 D. 使用Application Context创建Handler。正确答案AB。C选项的迷惑性在于“只有短延迟”但短延迟也有时间窗口只要Activity在延迟期间被销毁消息持有Activity引用就会导致泄漏。短延迟只是缩短了泄漏时长不改变泄漏本质。D选项是错的Handler不依赖Context的引用但Handler本身如果靠Application Context也无法解决静态内部类持有外部类引用的问题。正确道路只有两条静态化Handler并解绑消息或者在destroy时清空消息队列。5.3 HashMap扩容的时刻题目一个初始容量16、负载因子0.75的HashMap元素个数达到多少时触发扩容A. 12 B. 13 C. 16 D. 11正确答案A。threshold 16 * 0.75 12注意是size threshold才触发也就是说当已有12个键值对时第13个put进HashMap时才会触发扩容。题目问“元素个数达到多少时触发”这个边界特别容易选错。很多人在12和13之间犹豫是因为忘记“到达阈值”和“触发扩容”其实差了1次put操作。如果题目写“元素个数达到才会在下次put时触发扩容”填12没错。如果写“元素个数达到时当前put操作即触发扩容”那填13。做题时一定要看清问法。5.4 进程优先级判断题目以下哪些属于前台进程A. 正在显示在屏幕上的Activity所在进程。 B. 正在执行BroadcastReceiver.onReceive()的进程。 C. 运行着Service且用户可见但不可交互的进程。 D. 拥有前台Service的进程。正确答案ABD。C错在它不是前台进程而是可见进程。可见进程的特征是用户能看到界面但无法交互例如此刻弹出了一个透明Activity或者一个非全屏Activity显示中。可见进程的优先级低于前台进程高于服务进程。这个层级关系一定要理清。5.5 排序算法稳定性的实战判断题目对序列[3, 3, 5]排序排序后3和3的相对位置保持不变则此排序算法是A. 稳定排序 B. 不稳定排序 C. 无法判断 D. 任何排序都能保持正确答案A。稳定排序的定义就是相同元素的相对顺序在排序后不变。这道题考的是概念本身但因为带有具体数字很多人会被绕晕。做这类题先问自己“交换会不会发生在相同值元素之间”如果不会就可能稳定。5.6 TCP为什么是三次握手题目客户端向服务端发起TCP连接为什么需要三次握手而不是两次A. 三次握手能确认收发双方的收发能力都正常。 B. 三次握手能防止失效的连接请求突然到达服务端。 C. 三次握手能让服务端确认客户端关闭了连接。 D. 三次握手能协商滑动窗口大小。正确答案AB。C错在关闭连接是四次挥手而不是三次握手干的事。D的窗口协商发生在握手阶段。核心就是A和B的语义第一次握手服务端确认客户端发送正常第二次握手客户端确认服务端收发正常第三次握手服务端确认客户端接收正常。一次成功的数据传输需要双方都知道“对方能收能发”两次不够就是因为无法让服务端确认客户端接收正常。5.7 主线程不能做网络请求题目Android中在主线程直接进行网络请求会出现什么A. 抛出NetworkOnMainThreadException。 B. 程序会崩溃。 C. 网络请求会被系统自动降级。 D. 编译期报错。正确答案AB。Android从3.0Honeycomb开始禁止在主线程访问网络否则抛NetworkOnMainThreadException异常未捕获时程序崩溃。D是错的这种错误不是编译期报错而是运行时崩溃。这道题考的是“线程限制”的基本概念但很多新手会把编译期错误和运行时错误搞混。6. 一套客观题之外的复习方法论做题只是检测不是目的。我复盘360这套笔试题时最大的感受是笔试的客观题部分虽然覆盖广但其实都是有迹可循的重点永远是那波核心基础。下面聊聊怎么利用这套题达到更好的复习效果。6.1 按知识点模块限时训练建议把整套题拆成模块来限时刷不要一套做完拉倒。Java部分30分钟Android部分40分钟数据结构网络操作系统部分20分钟。每个模块做完不要急着看答案先自己总结“这道题在考哪个知识点”再对照解析。这样可以锻炼“读题识考点”的能力考场上看到题能快速定位到自己的知识体系。我当时把每个模块的错题单独拉了一张表记录三列错题归属的知识点、错误原因是概念不清还是细节忘记还是粗心、正确解析。复习时只翻这张错题表效率比重新刷一遍整套题高得多。这里分享一个小技巧客观题的错题不要只记正确答案要把错误的选项改成正确的把它当成判断题去重做。比如你选了C但正确答案是AB那就自己试着把C的说法改成“在什么前提下才是对的”改对了才说明你真懂了这个知识点。6.2 结合源码加深理解客观题很多答案直接来自源码层面的行为。比如Handler的内存泄漏你只背“静态内部类弱引用”是记不牢的一旦题目换个马甲比如把“静态Handler持有Activity弱引用”换成“静态Handler持有Activity强引用但放在静态变量里”你就容易懵了。建议抽出半天时间实际打开Android Studio建一个最简单的工程写一个Handler在onCreate里发延迟消息然后在onDestroy里打印日志。你亲眼看到Activity销毁了Handler还在那里内存泄漏的感受就会非常直观。HashMap同理JDK源码就在安装目录里把putVal、resize、treeifyBin三个方法通读一遍很多关于HashMap的问题都能迎刃而解。不是让你背源码而是看懂关键分支逻辑。比如为什么树化要同时判断链表长度和数组长度在源码注释里写得很清楚如果数组长度小于64优先扩容因为扩容能减少碰撞比转红黑树成本更低。这种源码细节客观题非常爱考。6.3 输出式复习把考点当真题讲给别人听如果你只是对着答案看一遍记忆留存率很低。真正有效的是“输出式复习”把一道题讲给自己听或者假装讲给一个刚学Android的朋友听。用口语把整个知识点串一遍哪里卡壳哪里就是你知识体系的漏洞。比如“为什么singleTask要配合onNewIntent使用”如果你能解释清楚这道题基本不会再错。我复习季每天晚上花20分钟挑三道当天错题用手机录音讲一遍第二天听回放。听起来有点笨但效果是真的好。最后说一点个人体会。Android客观题看似繁杂其实考的都是最基础的东西很少出现偏题怪题。360这套2018年春招的笔试合集放在今天依然有很强的参考价值因为它考的不是框架用法而是功底。你如果能把这套题的每个知识点都吃透后面无论做什么App、面什么公司底气都会足很多。踏踏实实把基础啃下来比收藏一百份面经都有用。
返回列表