前言

鄙人尘世间一个迷途小开发,二流程序员。只是一个二流Android攻城狮在市场的大潮之下,用一个月时间面试+复习+总结,最终拿到了自己喜欢公司offer(非一线大厂,但是薪资也涨了40%多,对我来说已经很满意惹)的故事。

当然,大厂谁不想去呢?可是时间紧,生活压力大,计划赶不上变化。生活的真谛就是妥协而已。

前提是出来社会摸爬滚打三年多,不得不承认人是分三六九等的。即便是专注度、努力这些颇为客观的因素,也是因人而异的。(没办法,我也知道客观上应该努力啊555,可我主观上只想躺着刷B站~555)First,先列一下鄙人目前的客观情况:

  • 双非本科,非计算机专业
  • 工作四年,都是小厂,小组最多没超过4个人
  • 算法基础一丢丢(翻书‘马冬梅’,合书‘什么梅’)英语水平半文盲
  • 懂一点应用层方面的音视频编解码知识

面试之前

首先我不建议频繁的跳槽,除非被逼无奈,频繁跳槽,不光会成为面试官害怕的一个方面,对自己的沉淀也是没有帮助的。

同时我不建议裸辞,这样会存在太多的不定性因素,如果面试时间拖得太久,这段时间你没有经济收入,但是你还在支出(房租,日常生活开销)。这样会带来无形的压力,同时如果面试受挫,很容易失去信心,甚至怀疑自己的能力。

但是离职也有他的好处,因为,有些公司可能项目非常急,需要迅速上岗,那么你离职的交接办理也会耽误一些时间,那么也会成为面试官考虑的一个因素。所以还是要结合自己的情况而定。

如何准备

我是从6月接近中旬开始面试的,一直到7月底结束,整个面试周期差不多一个月左右的时间。这次面试采用的策略是以战代练,就是边面边复习。

面试的话,主要是朋友内推,Boss和拉勾。但Boss的话,初期不建议把简历可见,我就在这方面吃了苦头(别提了都是泪)。接下来我将这一个月内我接触的知识点铺展开来,也给大家一点参考。

  • 算法:LeetCode,把链表、排序、树标签里所有简单类型的题目练一下手。特别是排序,冒泡、快速、二分、选择、归并一定要达到手写的水平!

  • 数据结构:Java的HashMap——7和8的区别、ArrayList、LinkeList。Android的ArrayMap、SparseArray系列。还有阻塞队列ArrayBlockingQueue、LinkedBlockingQueue。

  • HashMap的结构和细节是遇到最多,建议仔细看一下源码,一定要有自己的理解(划重点)。把HashMap如何存储、如何查找。hash碰撞,以及内存利用率这些问题理解一下设计模式和架构:准备一些自己拿手的模式,在网上查一下资料。准备一些套话,关键词耦合,二次修改方便,外部不用关心内部实现等等。MVC、MVP、MVVM三种,起码要了解两种,并且能清晰明确的说出,两种架构间的优缺点。

  • 我本身经历过一次MVC -> MVP的过渡,所以面试的时候就只提了这两种。MVVM没接触过,就实话实说没搞过,面试官也不会再问。千万不要打肿脸充胖子,没接触过就说不会就可以了。关键词:UI逻辑、业务逻辑、不影响对方的前提下修改、逻辑清晰,方便定位

  • Android基础:这个就很重要了,当然涉及面也相当广。四大组件,生命周期这个啥都不说了,直接冲就是了,基本都会问到。Handler、View绘制流程、事件分发,这些都是老生常谈。

  • Android框架基础:AMS,Activity的启动过程。Android绘制流程(这个看个人了,因为我简历上写了熟悉Canvas库,手动狗头)Java基础:多线程、线程池、锁机制,这两个知识点问到的还挺多的。其他的包括,内存区域、内存泄漏、垃圾回收。。。(这些懂个概念即可,不深究)

简历

简历制作是一种学问,一份好的简历往往让人眼前一亮。同时简历要突出重点。

  • 技能特长 比如你自定义View好,那么就把View的相关技能写上,比如:View加载流程,事件分发,自定义属性,滑动冲突等等,如果视频方面强那么就相关的技能写上。尽量不要有精通,除非你真的“精通”。否则就是给自己挖坑。也不要写一些太过常见的技能,如果:了解Activity的生命周期。谁都知道的东西,没别要单拿出来。也不要太长或太短10-12个技能特长左右。宗旨在于表达的特点简单明了。其他的点大家在自己搓摩下。

  • 项目介绍 如果你是实习,那么你一定要有自己在大学项目,或是毕业设计,或是团队项目。如果是在职一定要有公司的项目。同时项目不宜过多2-3个即可,如果你有觉得可以在简历上写的前端或是后台的项目,那么会有很大的加分。同时项目介绍不要太过啰嗦,3-5行,突出架构,核心技术,主要功能与模块即可,同时写出自己在其中做了那部分内容。(这部分要写好,因为面试官很可能会问你,你开发中遇到的问题,难点,优化,协作,调试等相关问题)

  • 其他技能 如果有英语4.6级一定要写上,有github,个人blog一定要写上地址。这我就不用说了吧。

例如:

简历制作总结:

至于其他的对大家应该没有难度。同时适当的包装无可厚非,求职者想找个好工作,面试官想找个好员工。对方就像相亲一样。一定会把你的底摸个清楚的。如果相亲的时候的没问题,等孩子都有了那就晚啦。哈哈,我就是这个意思。包装的目的是为了增加HR的通过率。这样才会有面试机会,对我们这种渣渣来说,面试机会比面试通过与否更重要。因为面试邀请都没有,你准备有个P用。最后我还是希望大家提高自己的实力,实力才是硬道理。

面试

以上是一些复习的知识点,因为要准备的东西还是蛮多的。 所以时间上的安排一定要灵活,我是早上复习Java基础,中午看Android,晚上复习算法和数据结构。

有面试的话,就提前去了解一下公司的产品,去官网上冲一冲浪,下个APP玩一下。也算提前给自己一个心理准备。

以下是一些面试题,供给大家参考:

  • GC讲一下?
  • Java数据结构了解吗?
  • 链表和数组的区别Final?
  • 讲一下项目中使用过锁吗?
  • synchronized和reentrantlock?
  • 讲一下多态?
  • 内存泄漏?
  • android中的内存泄露?
  • 讲一下handler机制?
  • listview和RecyclerView的区别
  • activity的生命周期
  • activity的启动模式
  • singletop中再次启动栈顶的activity,生命周期怎么变化?
  • fragment了解吗?
  • 和activity的区别?
  • handle机制?
  • onNetIntent了解吗?
  • 怎样判断ipv4的地址是否合法?(好难好难)
  • 最长连续子序列长度(撕了一个使用set的),再度优化,有没有其他想法?这个空间复杂度高?时间复杂度什么?
  • 将阿拉伯数字转换为大写数字?一直抠算法?不断修改测试用例?不断改bug?
  • Android你了解什么?
  • Android怎样开启多线程?

因为问题比较多,我主要写了比较常问的问题还是那句老话,面试是一个双向考察的过程,面试官考察你,同时你也要考察考察公司。要真是不喜欢的话,工作做得也不开心,当然也不会长久。工作毕竟还是占据了生活中的大部分时间,找一个自己喜欢并愿意投入的工作对自己的成长也好一点。同时,面试也是一个考察综合能力的地方。不要以为技术上准备的很充分了就万事大吉。在面试的时候,态度、分析问题的能力、自信度、人品这些都决定了你能否拿到offer。

面试细节

面试一般的时间是在两三个小时左右,作为求职者。我们要在这段时间内,将我们的价值展现给面试官和HR。就像推销产品一样,你得站在旁观者的角度思考一下,这个人值不值得我们买入(发offer),他(她)的性格怎么样,人品值得信任吗等等。站在这个角度想一下的话,有很多问题你自己就想通了。当然你考虑这些问题的前提是你的技术准备已经挺充分的了。

  • 自我介绍;准备一段两三分钟的自我介绍,挑一些有亮点的东西说一下。面试官也是人,你长篇大论五六分钟,他记住的点也不会太多。所以要精简,要学会提炼关键字。譬如:工作上偏重架构设计,技术上偏重技术实现(实现了什么牛逼的技术)

  • 语气腔调:这个也有必要练习一下(不要笑,这个很重要),你可以自己录音听一下,试试有没有一个合适的语速让别人能听清楚你说的话。还有说话要自信,不要结结巴巴,不会的东西就直接说没接触过就行了,切忌扭扭捏捏~~还有回答问题的时候,不要等面试官问完就立马回答。停顿个几秒钟作思考状(手动狗头),如果是特别特别熟的问题,就稍微顿一下,不要太流利。有些点可以适度说想不起来这个程度自己把握,挑一些不太重要的点,留给面试官补充,不然你各个问题回答如流,只会加速面试流程。说不定碰到一个轴一点的,就抛出一个史诗大问题给你。当然这个小技巧面试用一次就最多了,千万别乱用。。。

  • 离职原因:这个有的技术官不会问,有的会问。HR会比较看重这个问题,这个就自己斟酌吧。反正不要给人留下这个人很浮躁,不会在我们这里久留的印象就好了。

  • 技术思考:这也是一个很泛的点,要具象的话。就是你在项目中如何写你的代码,有的面试官会看重这个问题。这个嘛,就纯是看个人了~~~

如今的面试官经验也丰富很多,很多问题并不会直接问你,而是抛出一个具体的问题由你去分析。有的还是考察你在产品和开发之间的项目协调问题,比如出了一个客观上无法解决的问题,你该如何去协调。还比如会考察你一些对产品的思考。其实除了思考力,足够扎实的技术能力也足以帮助大家度过“分水岭”。

Android 中高级面试题汇总

Android 中高级面试题汇总包括:

Java基础、Android基础、UI控件篇、网络通信篇、架构设计篇、性能优化篇、源码流程篇、新技术篇、面试篇九个章节,一共1932页。

在这里插入图片描述

Java基础

  • 静态内部类和非静态内部类的比较
  • 多态的理解与应用
  • java方法的多态性理解
  • java中接口和继承的区别
  • 线程池的好处,详解,单例
  • 线程池的优点及其原理
  • 为什么不推荐通过Executors直接创建线程池
  • BlockingQueue及其实现
  • 深入理解ReentrantLock与Condition
  • Java多线程:线程间通信之Lock
  • Synchronized 关键字原理
  • ReentrantLock原理
  • HashMap中的Hash冲突解决和扩容机制
  • JVM常见面试题
  • JVM内存结构
  • 类加载机制/双亲委托

在这里插入图片描述

Android基础

Activity知识点(必问)

  • Activity 启动过程全解析
  • Fragment 知识点
  • onSaveInstanceState 以及 onRestoreInstanceState 使用
  • 4onConfigurationChanged使用以及问题解决

Fragment 知识点

  • Fragment 的通信问题, 新建 Fragment 为何不要在构造方法中传递参数
  • 为什么官方推荐 Fragment.setArguments(Bundlebundle)这种方式来传递参数,而不推荐通过构造方法直接来传递参数呢?
  • Androidx 下 Fragment 懒加载的新实现
  • Fragment全解析系列
  • Google-Fragment概览
  • Google-与其他Fragment通信

Service 知识点

  • Handler知识点(必问)
  • Android主线程阻塞处理及优化
  • 深入聊聊Android消息机制中的消息队列的设计
  • 深入理解MessageQueue
  • 你真的懂Handler.postDelayed()的原理吗?
  • Handler.postDelayed()是如何精确延迟指定时间的
  • Handler延迟消息执行机制,会阻塞吗?

Intent知识点

  • Android跨进程传递大内存数据
  • 数据存储

在这里插入图片描述

UI控件篇

屏幕适配

  • Android屏幕适配和方案
  • Android 目前稳定高效的UI适配方案

主要控件优化

  • RecyclerView优化

事件分发与嵌套滚动

  • NestedScrollingParent & NestedScrollingChild
  • 动态化页面构建方案
  • 组件与布局

网络通信篇

网络协议

  • 彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)

在这里插入图片描述

架构设计篇

  • MVP架构设计
  • 组件化架构

在这里插入图片描述

性能优化篇

  • 启动优化
  • 内存优化
  • 绘制优化
  • 安装包优化

在这里插入图片描述

源码流程篇

  • 开源库源码分析
  • Glide 源码分析
  • Glide 面试题
  • 聊一聊关于Glide在面试中的那些事
  • 简历上如果写Glide,请注意以下几点…
  • Glide OOM问题解决方法汇总
  • OkHttp源码分析
  • Okhttp连接池复用机制
  • Okhttp 流程和优化的实现
  • OkHttp的整个异步请求流
  • HttpEngine中的sendRequest方法详解
  • OkHttp解析大总结
  • Okhttp任务队列工作原理
  • Android 网络优化,使用 HTTPDNS优化 DNS,从原理到 OkHttp 集成
  • Retrofit源码分析
  • RxJava源码分析
  • RxJava原理与源码分析

在这里插入图片描述

新技术篇

  • 实战问题

在这里插入图片描述

面试篇

开源文档+面试题合集

  • android事件分发机制,请详细说下整个流程
  • android view绘制机制和加载过程,请详细说下整个流程
  • android四大组件的加载过程,请详细介绍下
  • Activity的启动模式
  • A、B、C、D分别是四种Activity的启动模式,那么A->B->C->D->A->B->C->D分别启动,最后的activity栈是怎么样的
  • Activity缓存方法
  • Service的生命周期,两种启动方法,有什么区别
  • 怎么保证service不被杀死
  • 静态的Broadcast 和动态的有什么区别
  • Intent可以传递哪些数据类型
  • Json有什么优劣势、解析的原理
  • 一个语言的编译过程
  • 动画有哪几类,各有什么特点
  • Handler、Looper消息队列模型,各部分的作用
  • 怎样退出终止App
  • Android IPC:Binder 原理
  • 理解Window和WindowManager
  • Bitmap的处理
  • 如何实现一个网络框架(参考Volley)
  • ClassLoader的基础知识
  • 插件化框架描述:dynamicLoadApk为例子
  • 热修复:Andfix为例子
  • 线程同步的问题,常用的线程同步
  • Asynctask和线程池,GC相关(怎么判断哪些内存该GC,GC算法)
  • 数据库性能优化:索引和事务
  • APK打包流程和其内容
  • 网络劫持的类型原理
  • 操作系统进程和线程的区别
  • 在这里插入图片描述

由于文章篇幅有限,文档资料内容较多,本可以提供链接下载,但无奈容易被和谐,所以全部存档,需要这些文档这里的朋友,可以【[点击这里免费获取](https://shimo.im/docs/jVjRCxHDxXYPx9V8/ 《2021最新大厂Android面试资料汇总+电子书+视频》,可复制链接后用石墨文档 App 或小程序打开)】,希望能够共同进步,共勉!

文末

互联网行业是一个知识迭代非常快的行业,如果你不养成学习的习惯,其他人不会停下来等你,这样的话你就等于一直在退步!