Android开发

Android开发技巧!给Android程序员的一些面试建议

本文主要是介绍Android开发技巧!给Android程序员的一些面试建议,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
# Android开发面试的几部分 **1、基础知识** 基础知识包括几个部分:Java(JDK、JVM)、Android、数据结构和算法、计算机基础、设计模式,有的还会问Flutter。 ![2020Android面经:教你增加拿到BAT等大厂offer几率( 面试技巧)](http://www.www.zyiz.net/i/li/?n=2&i=images/20210711/1626013843552538.jpg) **Java部分**: 不太推荐这部分只看博客,因为很多博客并不系统也不完整,推荐完整看一遍《深入理解Java虚拟机》这本书,基本上这里面涵盖了JVM相关的所有面试问题,包括内存分区、GC机制、内存模型、锁、字节码、类加载等。JDK的部分会杂一些,基本上可以归类为几种:容器(必问HashMap、CurrentHashMap、ArrayList等)、线程池(必问)、注解、同步工具、动态代理、notify/wait/sleep。这部分可以从一些JDK相关的文章中去整理一遍。 **Android部分:** **这部分必问的是Handler机制、触摸事件传递、四大组件启动流程、View绘制流程、Binder机制、生命周期**。经典的问题比如: * 触摸事件一定是先传递到Activity然后才传递给View的么? * 如果要在Application的onCreate生命周期之前执行一些逻辑,可以放在哪里? * draw、onDraw、dispatchDraw执行的顺序如何? * View真正显示是在onResume之前还是之后? * Activity中嵌套有一个Fragment,startActivity之后,Activity和Fragment的生命周期顺序是如何的? **数据结构与算法:** 这部分在客户端开发中考察的比例会小一些,不过也有很多公司非常重视手写代码。经常碰到的问题有二叉树遍历、有序二维数组查找,排序等,基本上以《剑指offer》或者《编程之美》为准就可以了。 **计算机基础:** 这部分涵盖的比较杂,比如计算机网络(7层网络模型、Http和Https)、git工作流和命令、计算机缓存策略、UML、信息安全等等。 **设计模式:** 在自己的项目中一定要多总结和使用设计模式,面试官问你使用过什么设计模式的时候,如果能回答出比如状态模式、责任链、装饰等等,肯定会加分不少。如果只是回答单例和建造者模式,那就会逊色多了。这部分推荐看《研磨设计模式》。 **开源项目:** 这个也是必问的环节之一,建议从自己项目使用的开源项目入手,跟着代码,画一遍流程图和架构图,仔细体会这里面设计的优点和缺点。 比如OkHttp、LeakCanery等等,这些都可以。开源项目根据面试官的个人经验不同,问的深入程度也不一样,这时候就需要你个人的一些引导技巧,比如面试官可能不是很熟悉这个框架,这时候你能主动表达出这里面设计的一些细节,也能给面试官留下不错的印象。**切忌在简历上写只是用过但是没看过源码的框架。** ![2020Android面经:教你增加拿到BAT等大厂offer几率( 面试技巧)](http://www.www.zyiz.net/i/li/?n=2&i=images/20210711/1626013843243567.jpg) # 重点项目经历 小厂的项目往往追求业务快速迭代上线,相对比较能容忍一些技术难点,但是这些**技术难点往往是能体现一个人技术能力的**。所以你如果在小厂,就不能过分陷入到业务中,必须跳出来找一些有亮点的技术点,做好做精。这些技术点才是一个程序员安身立命的本钱,否则公司业务陷入困境了,你的价值也就不复存在了。在如何准备面试中项目这部分,小编有几点心得: **分成三部分:** 1. 为什么要做这个点, 2. 考虑了什么因素并且是如何做的, 3. 取得了什么效果(比如启动速度从1000ms降到200ms,这种具体的数据) 可以把几个小点串起来,这样可以显得更系统和全面一些,比如代码优化和性能优化结合在一起讲。 小厂的一些优化点往往只能做性价比最高的一部分,这时候还可以讲一下业界还有哪些更优的方案 最好再准备一下“如果你没有离职项目中还有有什么不足和可以优化的地方?”(笔者面试中碰到过几次这样的问题) **小厂跳大厂,技术基础可以准备得很充分,但是项目绝对是一个弱项。**大厂一个App可能就有几十上百人在做,小厂很多所谓的优化在大厂的面试官眼中可能都是他们很早就做过了,这时候项目本身做了哪些东西并不是太重要,需要着重体现你解决问题的思路以及你是一个有追求的程序员,至少你要能做到业界的平均水平,这样才能有机会通过面试。 # 技术以外的东西 大厂面试中技术以外的部分也是非常重要的一部分,这部分大多是一些软技能: **自我驱动和追求** 这部分主要是在平时工作中的一些自我驱动学习和自主追求一些技术能力,而不仅仅是完成需求就可以了,这样才能体现出你个人的成长性和潜力。 **沟通和协作** 这部分会评估你未来在团队的融入程度以及跟团队跨团队协作和沟通的能力。比如你在工作中是否能正确看待和解决一些跨部门沟通的问题。 # 我的面经总结 主要分为四个方面: **Android** 1. Android各个版本的特性(例如6.0,动态权限) 2. ANR的原因 3. Android中进程间通信的方式和对比 4. AsyncTask的实现原理及优缺点 5. Handler机制 6. 自定义view三部曲,流程(或者实际场景题,例如实现一个表盘,怎么做) 7. FrameWork层次结构 8. Activity生命周期(A跳转到B,A和B中生命周期的执行顺序) 9. Dvlik、ART、JVM三种虚拟机的区别 10. 能不能在非UI线程更新UI 11. Service和IntentService的区别 12. Thread和HandlerThread的区别 13. Touch事件分发机制 14. 怎么知道一个Activity是否发生了泄露 15. 从点击一个APP图标开始发生了什么 16. Activity启动流程(源码看一遍,能大致讲出来就行) 17. Activity启动模式(四种) 18. Intent启动Activity的方式 19. onStart和onResume的区别 20. LruCache以及实现原理 21. Android中的MVC、MVP、MVVM的区别和联系 22. Parcelable和Serializable的区别 23. Service生命周期 24. Service的启动方式及区别 25. Binder机制 26. onSaveInstanceState和onRestoreInstanceState的调用时机(需要理解,一般会出个场景让你判断) 27. onNewIntent的调用时机(同上) 28. Android中的性能优化和内存优化 29. RxJava说一下(常用操作符,背压,线程切换原理,实际应用) 30. RxAndroid说一下 31. EventBus原理 32. Volley原理 33. OkHttp原理 34. Retrofit原理 35. RxJava和Retrofit结合 36. Dagger2原理 37. 组件化介绍一下(为什么要有组件化,怎么解决合并冲突问题) 38. 快应用介绍一下 39. 屏幕适配的常用方法 40. Service、进程保活 41. Glide原理 42. AsyncTask原理 43. SurfaceView和普通View的区别 44. 依赖注入框架的实现原理 45. Git项目管理 46. 什么是三级缓存 **Java** 1. 常用的设计模式(掌握常见的大约10种就Ok) 2. ThreadLoal的作用及原理 3. 线程的实现方式和实现原理 4. 线程的状态,怎么创建线程,线程状态之间的转化(例如什么情况下线程会由运行变为阻塞) 5. 进程的状态 6. transient关键字的作用 7. sleep()和wait()的区别 8. hashcode()方法的作用 9. ==和equals()方法区别(为什么重写了equals()方法还要重写hashcode方法) 10. Java的三大特性 11. 接口和抽象类的区别 12. 进程和线程的区别 13. 线程池各参数的含义,以及四种常用线程池的应用场景 14. 阻塞队列的特点和原理和应用场景 15. yield()方法的作用 16. 多线程锁的类型,ReentrantLock,Lock,synchrnoized关键字等 17. volatile关键字的作用(在单例中的作用) 18. 闭包的概念 19. 泛型(什么是类型擦除,为什么要有泛型) 20. 锁优化方式(自旋锁、自适应自旋、锁消除、锁粗化、偏向锁) 21. 类执行顺序 22. StringBuffer和StringBuilder的区别 23. HashMap的实现原理(最好是1.8之前和1.8之后都要知道) 24. ConcurrentHashMap的实现原理(同1.8之前和之后都要知道) 25. ArrayList和LinkedList的区别 26. Java内存区域(堆区和栈区的区别,什么是运行时常量池) 27. 装箱和拆箱 28. OOM异常 29. GC机制(GC区域,如何判断一个对象是否可以回收,GC算法,GC策略) 30. 类加载机制(类加载过程双亲委派模型) 31. Java内存模型(主内存与工作内存) 32. 原子性(AtomicInteger原理)、可见性(volatile关键字)、有序性,如何保证 33. 先行发生原则(happens-before原则) 34. 线程安全的实现方法 35. 锁的类型(悲观锁,乐观锁CAS算法,公平锁,非公平锁等怎么实现) 36. StringBuffer和StringBuilder区别 37. 注解(自定义注解) 38. 四种引用的概念和区别 **计算机网络** 1. HTTP协议(头结构,几种请求方法,缓存机制,各版本的区别) 2. HTTPS协议,和HTTP协议的区别,密钥协商的过程,SSL机制 3. 对称加密和非对称加密 4. TCP和UDP的区别 5. TCP的三次握手、四次挥手(包括状态码,以及四次挥手后为什么要等待2*TIME_WAIT) 6. TCP拥塞控制机制 7. TCP滑动窗口机制 8. TCP超时重传机制 9. DNS协议 10. 五层网络模型(物理层,数据链路层,网络层,传输层,应用层) 11. IP头部 12. 在浏览器地址输入一个网址,发生了什么 **数据结构及算法** 1. 链表(单向链表,双向链表) 2. 数组(旋转数组) 3. 队列(双端队列,阻塞队列) 4. 栈 5. 堆(大根堆、小根堆) 6. 二叉树(完全二叉树、满二叉树、二叉排序树、平衡二叉树,红黑树)(深度遍历,层序遍历) 7. 图(重点掌握图的深度优先遍历和广度优先遍历) 8. 七大排序算法(冒泡,选择,插入,归并排序,快速排序,堆排序,希尔排序) 9. 剑指offer上的算法题(能够对照目录,一看题目,能有思路,就ok) 10. 二分查找 11. 两个栈实现一个队列,两个队列实现一个栈 12. 海量数据排序 13. topK问题,有1千万个数,怎么快速找出最大的100个 14. 合并两个有序数组,合并两个有序链表 15. 杨氏矩阵(横向递增,纵向递增)中如何找到指定的数字 16. 翻转一句话,例如I am 3 years old,翻转后,old years 3 am I 17. 有10亿条数据,现在只有200M内存,怎么找出这10亿条数据中出现次数最多的100条数据 ### 结尾 **最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。** 首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术) >泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶 >注解原理丶注解原理丶序列化 >Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等) >代码框架结构优化(数据结构丶排序算法丶设计模式) >APP性能优化(用户体验优化丶适配丶代码调优) >热修复丶热升级丶Hook技术丶IOC架构设计 >NDK(c编程丶C++丶JNI丶LINUX) >如何提高开发效率? >MVC丶MVP丶MVVM >微信小程序 >Hybrid >Flutter ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210711/1626013843808461.jpg) 接下来是资料清单:(**敲黑板!!!**) **领取通道在这里给你们摆上了~** ##### **[点击我的GitHub免费获取](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)** * * * **1.数据结构和算法** ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210711/1626013843536372.jpg) **2.设计模式** ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210711/1626013844652363.jpg) **3.全套体系化高级架构视频**;七大主流技术模块,视频+源码+笔记 ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210711/1626013844269654.jpg) **4.面试专题资料包**(怎么能少了一份全面的面试题总结呢~) ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210711/1626013844240299.jpg) >不论遇到什么困难,都不应该成为我们放弃的理由!共勉~ 如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。 ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210711/1626013844463797.jpg)
这篇关于Android开发技巧!给Android程序员的一些面试建议的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!