临近年末,很多程序员心里大概都准备着年后找工作或者跳槽。最近也有很多人都在交流群里求大厂面试题。刚好我今年从小型软件公司离职,奋战4个多月成功拿到了阿里Android开发工程师的offer。讲述面经的文章很多,本篇文章主要记录分享我的面试前的准备过程,涵盖了辞职原因、准备过程、面试刷题、以及简历制作与投递。
我为什么离职
关于离职原因,马云有一句经典的话“要么钱没给到位,要么心委屈了”,想必大家耳熟能详了,我这里再细说一下我个人离职原因:
工资倒挂,涨薪不如意
在之前的小厂薪资倒挂现象严重,新入职的员工工资明显高过老员工,企业宁愿高薪招聘一位新员工,也不愿给我们老员工加工资,这让老员工十分寒心。接地造成老员工离职。继而还有一种,当感觉自己的劳动并未收获到相应的价值之时,继续在原公司呆下去意义也不大。
十年如一日的技术
在小型软件公司干的三年时间里,其实只拥有了一年的技术经验之时。技术视野较窄,能力提升缓慢,没了技术上升的空间,日复一日,年复一年,只干着同样的事情,往高处走才是必然的选择。
准备
大厂的正常面试流程周期一般是一到两个月,就算薪资谈完到 offer 最终审批下来可能都需要一到两周,这段时间心理是比较难熬的,因此我没有直接裸辞。我不仅要把日常的工作做好,Android基础知识+高级面试刷题(毕业至今一直养成了良好的习惯)。而新兴热点技术的学习+BAT大厂高频面试真题复习+项目学习准备,这些过程大概持续了4个多月。
其实每一次跳槽,都是对这几年工作的一个梳理和总结,虽然大家都明白“面试造航母、入职拧螺丝”的道理,对于公司而言,这是筛选人才的一个方式,毕竟人是第一生产力,只要有优秀的人才,那么造出的航母才可能“勇往直前,战无不胜”。对于个人而言,如果公司里同事优秀的人,那么你肯定也不会差,我们肯定更希望和优秀的人一起共事。
面试刷题
刷题我从常见Android基础知识面试题,刷到了Java面试题,继而攻坚Android高级面试题,以及突破学习Flutter相关热点技术面试题(不是很难),最后总攻近期大厂面试真题总结。这份面试题精编含答案解析我已经整理到了一份PDF文档里,共370页。下载地址
Android基础知识
一、 Activity
1、 什么是Activity?
2、 请描述一下Activity 生命周期
3、 常见的Activity类型有FragmentActivitiy,ListActivity,TabAcitivty等。请描述一下Activity 生命周期
4、 如何保存Activity的状态?
5、 两个Activity之间跳转时必然会执行的是哪几个方法?
6、 横竖屏切换时Activity的生命周期
7、 如何将一个Activity设置成窗口的样式
8、 如何退出Activity?如何安全退出已调用多个Activity的Application?
9、 Activity的四种启动模式,singletop和singletask区别是什么?一般书签的使用模式是singletop,那为什么不使用singletask?
10、 Android中的Context, Activity,Appliction有什么区别?
11、 两个Activity之间传递数据,除了intent,广播接收者,content provider还有啥?
12、 Context是什么?
二、 Service
1、 Service是否在main thread中执行, service里面是否能执行耗时的操作?
2、 Activity怎么和Service绑定,怎么在Activity中启动自己对应的Service?
3、 请描述一下Service的生命周期
4、 什么是IntentService?有何优点?
5、 说说Activity、Intent、Service是什么关系
6、 Service和Activity在同一个线程吗
7、 Service里面可以弹吐司么
8、 什么是Service以及描述下它的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service?
9、 在service的生命周期方法onstartConmand()可不可以执行网络操作?如何在service中执行网络操作?
三、 Broadcast Receiver
1、 请描述一下BroadcastReceiver
2、 在manifest和代码中如何注册和使用BroadcastReceiver
3、 BroadCastReceiver的生命周期
四、 ContentProvider
1、 请介绍下ContentProvider是如何实现数据共享的
2、 请介绍下Android的数据存储方式
3、 为什么要用ContentProvider?它和sql的实现上有什么差别?
4、 说说ContentProvider、ContentResolver、ContentObserver之间的关系
五、 ListView
1、 ListView如何提高其效率?
2、 当ListView数据集改变后,如何更新ListView
3、 ListView如何实现分页加载
4、 ListView可以显示多种类型的条目吗
5、 ListView如何定位到指定位置
6、 如何在ScrollView中如何嵌入ListView
7、 ListView中如何优化图片
8、 ListView中图片错位的问题是如何产生的
9、 如何刷新ListView中单个item的数据,不刷新整个ListView的数据?
六、 Intent
1、 Intent传递数据时,可以传递哪些类型数据?
2、 Serializable和Parcelable的区别
3、 请描述一下Intent 和 IntentFilter
七、 Fragment
1、 Fragment跟Activity之间是如何传值的
2、 描述一下Fragment的生命周期
3、 Fragment的replace和add方法的区别
4、 Fragment如何实现类似Activity栈的压栈和出栈效果的?
5、 Fragment在你们项目中的使用
6、 如何切换fragement,不重新实例化
Java面试题
一、 Java基础
1、 Java中引用类型都有哪些
2、 什么是重载,什么是重写,有什么区别? )
3、 String、StringBuffer和StringBuilder的区别
4、 关键字final和static是怎么使用的
5、 TCP/IP协议簇分哪几层?TCP、IP、XMPP、HTTP、分别属于哪一层?
二、 Java中的设计模式
1、 你所知道的设计模式有哪些
2、 单例设计模式
3、 工厂设计模式
4、 建造者模式(Builder)
5、 适配器设计模式
6、 装饰模式(Decorator)
7、 策略模式(strategy)
8、 观察者模式(Observer)
Android 高级
一、 Android性能优化
1、 如何对Android应用进行性能分析
2、 什么情况下会导致内存泄露
3、 如何避免OOM异常
4、 Android中如何捕获未捕获的异常
5、 ANR是什么?怎样避免和解决ANR(重要)
6、 Android线程间通信有哪几种方式(重要)
7、 Devik进程,linux进程,线程的区别
8、 描述一下android的系统架构?
9、 android应用对内存是如何限制的?我们应该如何合理使用内存?
10、 简述android应用程序结构是哪些?
11、 请解释下Android程序运行时权限与文件系统权限的区别?
12、 Framework工作方式及原理,Activity是如何生成一个view的,机制是什么?
13、 多线程间通信和多进程之间通信有什么不同,分别怎么实现?
二、 Android屏幕适配
1、 屏幕适配方式都有哪些
2、 屏幕适配的处理技巧都有哪些
三、 AIDL
1、 什么是AIDL以及如何使用
2、 AIDL的全称是什么?如何工作?能处理哪些类型的数据?
四、 Android中的事件处理
1、 Handler机制
2、 事件分发机制
3、 子线程发消息到主线程进行更新UI,除了handler和AsyncTask,还有什么?
4、 子线程中能不能new handler?为什么?
五、 Android中的动画
1、 Android中的动画有哪几类,它们的特点和区别是什么
2、 如何修改Activity进入和退出动画
3、 属性动画,例如一个button从A移动到B点,B点还是可以响应点击事件,这个原理是什么?
六、 ContentObserver 内容观察者作用及特点
项目框架的使用
一、 自我介绍
二、 开发中都使用过哪些框架、平台
三、 都使用过哪些自定义控件
四、 自定义控件:绘制圆环的实现过程
五、 自定义控件:摩天轮的实现过程
六、 自定义控件:可拖拽排序的GridLayout的实现过程
七、 流式布局的实现过程
八、 项目的流程
九、 项目中常见的问题
十、 即时通讯是是怎么做的?
十一、 设计模式六大原则
十二、 第三方登陆
十三、 第三方支付
十四、 常见框架分析
Flutter相关面试题全解析
Dart部分
1.Dart 语言的特性?
2.Dart的一些重要概念?
3.Dart 当中的 「..」表示什么意思?
4.Dart 多任务如何并行的?
5.dart是值传递还是引用传递?
6.Dart 属于是强类型语言 ,但可以用 var 来声明变量,Dart 会自推导出数据类型,var 实际上是编译期的“语法糖”。dynamic 表示动态类型, 被编译后,实际是一个 object 类型,在编译期间不进行任何的类型检查,而是在运行期进行类型检查。
7.Dart 中 if 等语句只支持 bool 类型,switch 支持 String 类型。
8.Dart 中数组和 List 是一样的。
9.Dart 中,Runes 代表符号文字 , 是 UTF-32 编码的字符串, 用于如 Runes input = new Runes('\u{1f596} \u{1f44d}');
10.Dart 支持闭包。
11.Dart 中 级联操作符 可以方便配置逻辑,如下代码:
12.说一下 Future?
13.说一下 Stream?
14.说一下 mixin?
15.Widget和element和RenderObject之间的关系
16.widget树的root节点
17.mixin extends implement之间的关系
18.Future和microtask执行顺序
19.await for的使用方式
20.赋值操作符
21.可选方法参数
22.作用域
23.构造方法
24.getter setter 重写
25.Assert(断言)
26.重写运算符,如下所示重载 operator 后对类进行 +/- 操作。
Flutter 部分
1.Flutter 是什么?
2.Flutter 特性有哪些?
3.基础知识
4.Flutter 中的生命周期
5.PlatformView
6.Platform Channel
7.Android 启动页
8.Flutter 和 Dart的关系是什么?
9.Widget 和 element 和 RenderObject 之间的关系?
10.mixin extends implement 之间的关系?
11.使用mixins的条件是什么?
12.mixin 怎么指定异常类型?
13.Flutter main future mirotask 的执行顺序?
14.Future和Isolate有什么区别?
15.Stream 与 Future是什么关系?
16.Stream 两种订阅模式?
17.await for 如何使用?
18.Flutter中的Widget、State、Context 的核心概念?是为了解决什么问题?
19.Widget的两种类型是什么?
20.State 对象的初始化流程?
21.Widget 唯一标识Key有那几种?
22.什么是Navigator? MaterialApp做了什么?
23.flutter与React Native有什么不同?
24.为什么说flutter是原生的
25.讲一下flutter的几个特点/优缺点
26.什么是ScopedModel / BLoC模式?
27.什么是stateWidget和statelessWidget?
28.谈一下flutter state的生命周期
29.StatefulWidget 的生命周期
30.Flutter 如何与 Android iOS 通信?
31.什么是 Widgets、RenderObjects 和 Elements?
32.说一下什么是状态管理,为什么需要它?
33.说一下 BLoC 模式?
34.如何统一管理错误页面?
腾讯、阿里、百度、美团、字节跳动、京东等)Android高频面试真题集锦
1.android事件分发机制,请详细说下整个流程
2.android view绘制机制和加载过程,请详细说下整个流程
3.android四大组件的加载过程,请详细介绍下
4.Activity的启动模式
5.A、B、C、D分别是四种Activity的启动模式,那么A->B->C->D->A->B->C->D分别启动,最后的activity栈是怎么样的
6.Activity缓存方法
7.Service的生命周期,两种启动方法,有什么区别
8.怎么保证service不被杀死
9.静态的Broadcast 和动态的有什么区别
10.Intent可以传递哪些数据类型
11.Json有什么优劣势、解析的原理
12.一个语言的编译过程
13.动画有哪几类,各有什么特点
14.Handler、Looper消息队列模型,各部分的作用
15.怎样退出终止App
16.Android IPC:Binder原理
17.描述一次跨进程通讯
18.android重要术语解释
19.理解Window和WindowManager#_Toc13399 )
21.如何实现一个网络框架(参考Volley)
22.ClassLoader的基础知识
23.插件化框架描述:dynamicLoadApk为例子
24.热修复:Andfix为例子
25.线程同步的问题,常用的线程同步
26.Asynctask和线程池,GC相关(怎么判断哪些内存该GC,GC算法)
27.网络
TCP协议与UDP协议的区别
28.数据库性能优化:索引和事务,需要找本专门的书大概了解一下
29.13.APK打包流程和其内容
30.网络劫持的类型原理:可以百度一下了解一下具体概念
31.java类加载过程:
32.retrofit的了解
33.bundle的数据结构,如何存储
34.listview内点击buttom并移动的事件流完整拦截过程:
35.service的意义:不需要界面,在后台执行的程序
36.android的IPC通信方式,线程(进程间)通信机制有哪些
37.操作系统进程和线程的区别
38.HashMap的实现过程:Capacity就是buckets的数目,Load factor就是buckets填满程度的最大比例。如果对迭代性能要求很高的话不要把capacity设置过大,也不要把load factor设置过小。
39.mvc、mvp、mvvm:
40.java的线程如何实现
41.ArrayList 如何删除重复的元素或者指定的元素;
42.如何设计在 UDP 上层保证 UDP 的可靠性传输;
43.Java 中内部类为什么可以访问外部类
44.设计移动端的联系人存储与查询的功能,要求快速搜索联系人,可以用到哪些数据结构?数据库索引,平衡二叉树(B树、红黑树)
45.红黑树特点
46.linux异步和同步i/o:
47.ConcurrentHashMap内部实现,HashTable的实现被废弃的原因:
48.HandlerThread是什么
49.IntentService是什么
50.class和dex
51.内存泄漏
52.过度绘制、卡顿优化:
53.apk瘦身:
54.ANR的形成,各个组件上出现ARN的时间限制是多少
55.Serializable和Parcelable 的区别
56.Sharedpreferences源码简述
57.操作系统如何管理内存的:
58.浏览器输入地址到返回结果发生了什么
59.java泛型类型擦除发生在什么时候,通配符有什么需要注意的。
60.activity的生命周期
61.面试常考的算法
62.Launcher进程启动另外一个进程的过程:启动一个app
63.开源框架源码
2019Android面试大全精编解析PDF:下载地址
简历
简历的重要性就不言而喻了,怎么样写好简历是个技术活,当然如果你有很好的背景(学校或者公司),那么不管你怎么写,基本上都不刷掉你,我们作为一般的人还是需要下一番功夫的。拿我的简历作为例子,大概有以下几个部分:
个人信息:姓名、出生日期、教育背景、博客地址、github地址、联系方式(手机、邮箱和微信号)
工作经历:毕业后待过哪些公司,一般是倒序,项目尽量精简明了,可以参考SMART原则
专业技能:自己熟悉的一些技能,这个为什么我写到最后,因为对于工作三年的同学来说,面试官更加注重的是你的项目经历,大部分面试都是看你的项目经历来提问。
怎样写简历,这个开源网站不错,教你怎么写简历,而且有一个在线markdown在线网站,可以导出pdf。
简历投递注意事项
一般HR都会集中处理简历,正序或者倒序都有可能,所以选择最合适的时间段去投递就好。
总体上来说,比较推荐的时间段就是周二至周四,上午9点以后。
除了投递时间之外,还有一些注意事项可以提高你的简历被阅读率:
1.尽量选择HR邮箱直投:不论是哪个招聘网站,整体的回复速度都要低于HR直投邮箱,大部分HR打开自己邮箱的频率也要高于其他招聘类网站。
2.邮箱实名:最好将发件人改为自己的名字,可以让HR一眼就看到,而不是乱七八糟的其他内容,不仅看起来更加整洁,也可以增加印象。
3.邮件名称固定格式:如果企业方有要求,要严格按照企业方的要求来,如果没有,应届生建议“姓名+学校+专业+应聘岗位+最快到岗时间(尤其是标注尽快到岗)”,言简意赅。
4.正文不要空着,记得添加附件.pdf:有些HR习惯下载一段时间内的所有简历附件,然后一起查看,如果你没有附件会直接被忽略,pdf是为了避免简历跑版的重要措施;也有些HR更倾向于一封邮件一封邮件地查看,这时正文如果有内容就会更加直接,正文和附件都有,双重保障。
不要认为一些小细节不重要~投递简历的很多小细节会决定第一印象的,看到一封简洁、信息明确的邮件,HR第一反应都会是“WOW,这个不错/还行,让我看看”
最后
感谢大家能耐着性子,看完我啰哩啰嗦的面经前的准备过程,以上仅是个人的观点。感觉三年稍纵即逝,在这三年的时间里,青春易逝,岁月蹉跎。但好在及时反省,果断离职。在这面试准备过程和学习又温故而知新成长了很多,最后感谢阿里、腾讯、今日头条面试官等所有帮助过我的人。