个人说明
大家好,在跟大家讲述自己的面试经历,以及遇到的面试题前,先说说几句题外话。
接触Android已经3年半,在工作中遇到疑难问题总是在网上博客上搜索答案,各位大牛大神总是把自己的经验分享出来,帮助我们这些需要帮助的人,由此表示衷心感谢!然而现在自己细想了一下,自己也是时候把遇到的问题并把解决方案分享出来,希望能帮助到有需要的人。
随着时间的流逝,很多人说互联网这一块已经越来越不好干了,因为烧钱时代已经过去,剩下的都是根基牢固的大公司,独角兽已经不复存在。这就直接导致了互联网岗位的下降,本人亲测,也的确如此。
2020.05月,本人离职(此时3年半工作经验,深圳就职),开始试水安卓市场,寻求一份合适自己,稳定的中大型公司。投了很多公司,面试机会并不是我想象中的那么多,即时面试过程顺利,也没有获得offer(候选人太多太多)。不过借此机会,前前后后我面了10家公司,现在就把我遇到的面试题,并且提供一些面试技巧给各位即将面试的同志们。
OK,进入主题,请看Android知识图谱。
面试,无非都是问上面这些问题(挺多的 - -!),聘请中高级的安卓开发会往深的去问,并且会问一延伸二。以下我先提出几点重点,是面试官基本必问的问题,请一定要去了解!
- 基础知识 -- 四大组件(生命周期,使用场景,如何启动)
- java基础 -- 数据结构,线程,mvc框架
- 通信 -- 网络连接(HttpClient,HttpUrlConnetion),Socket
- 数据持久化 -- SQLite,SharedPreferences,ContentProvider
- 性能优化 -- 布局优化,内存优化,电量优化
- 安全 -- 数据加密,代码混淆,WebView/Js调用,https
- UI-- 动画
- 其他 -- JNI,AIDL,Handler,Intent等
- 开源框架 -- Volley,Gilde,RxJava等(简历上写你会的,用过的)
急急忙忙投简历,赶面试,还不如沉淀一两天时间,再过一遍以上内容。想稳妥拿到一个offer,最好能理解实现原理,并且知道使用场景了。不要去背!要去理解!面试官听了一天这些内容是很厌倦的,最好能说出一些自己的见解。
面试题
顺序是根据记忆排的,没有优先级之分,都是重点。
-
Activity的启动过程(不要回答生命周期)
-
Activity的启动模式以及使用场景
(1)manifest设置,(2)startActivity flag
- Service的两种启动方式
(1)startService(),(2)bindService()
- Broadcast注册方式与区别
(1)静态注册(minifest),(2)动态注册
-
HttpClient与HttpUrlConnection的区别
-
http与https的区别
-
手写算法(选择冒泡必须要会)
-
进程保活(不死进程)
-
进程间通信的方式
(1)AIDL,(2)广播,(3)Messenger
- 加载大图
PS:有家小公司(规模写假的,给骗过去了),直接把项目给我看,让我说实现原理。。
最让我无语的一次面试,就一个点问的我底裤都快穿了,就差帮他们写代码了。。
- 三级缓存(各大图片框架都可以扯到这上面来)
(1)内存缓存,(2)本地缓存,(3)网络
-
MVP框架(必问)
-
讲解一下Context
-
JNI
-
java虚拟机和Dalvik虚拟机的区别
-
线程sleep和wait有什么区别
-
View,ViewGroup事件分发
-
保存Activity状态
onSaveInstanceState()
-
WebView与js交互(调用哪些API)
-
内存泄露检测,内存性能优化
延伸:
(1)内存溢出(OOM)和内存泄露(对象无法被回收)的区别。
(2)引起内存泄露的原因
-
布局优化
-
自定义view和动画
这部分面试官多数不会问很深,要么就给你一个效果让你讲原理。
- 设计模式(单例,工厂,观察者。作用,使用场景)
一般说自己会的就ok,不要只记得名字就一轮嘴说出来,不然有你好受。
延伸:Double Check的写法被要求写出来。
-
String,Stringbuffer,Stringbuilder 区别
-
开源框架,为什么使用,与别的有什么区别
这个问题基本必问。在自己简历上写什么框架,他就会问什么。
如:Volley,面试官会问我Volley的实现原理,与okhttp和retrofit的区别。
开源框架很多,我就选几个多数公司都会用的出来(框架都是针对业务和性能,所以不一定出名的框架就有人用)
网络请求:Volley,okhttp,retrofit
异步:RxJava,AsyncTask
图片处理:Picasso,Glide
消息传递:EventBus
以上框架请自行查找,太多了就不贴出来了。
- RecyclerView
这个挺搞笑的。有另外一个同事也在找工作,面试官嫌他没用过RecyclerView直接pass掉。
-
网页中输入url,到渲染整个界面的整个过程,以及中间用了什么协议?
-
具体介绍下TCP/IP
-
TCP的三次握手和四次挥手,为什么不是两次握手?为什么挥手多一次呢?
-
TCP和UDP的区别?
-
HTTP的几种请求方法具体介绍
-
HTTP请求和响应报文的格式,以及常用状态码
-
介绍对称加密和非对称加密
-
数字签名的原理
-
Base64算法是什么,是加密算法吗?
-
为什么多线程同时访问(读写)同个变量,会有并发问题?
-
说说原子性,可见性,有序性分别是什么意思?
-
实际项目过程中,有用到多线程并发问题的例子吗?
-
介绍几种启动模式。
-
屏幕旋转时Activity的生命周期,如何防止Activity重建。
-
线程的三种启动方式
-
线程run和start的区别
-
线程的几种状态,相互之间是如何转化的
-
String是java中的基本数据类型吗?是可变的吗?是线程安全的吗?
-
为什么要设计成不可变的呢?如果String是不可变的,那我们平时赋值是改的什么呢?
-
浅谈一下String, StringBuffer,StringBuilder的区别?String的两种创建方式,在JVM的存储方式相同吗?
-
线程池是干嘛的,优点有哪些?
-
线程池的构造方法每个参数是什么意思,执行任务的流程
-
Android线程池主要分为哪几类,分别代表了什么?
主要有四类:FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledTheadPool
-
索引是什么,优缺点
-
事务四大特性
-
讲讲几个范式
-
Recycleview和listview区别
-
Recycleview有几级缓存,缓存过程?
-
说说RecyclerView性能优化。
-
说说双重校验锁,以及volatile的作用
-
synchronized和volatile的区别
-
synchronized修饰static方法和修饰普通方法有什么区别
-
内存泄漏是什么,为什么会发生?
-
内存泄漏发生的情况有哪些?
集合类泄漏
单例/静态变量造成的内存泄漏
匿名内部类/非静态内部类
资源未关闭造成的内存泄漏
-
该怎么发现和解决内存泄漏?
-
什么是类加载机制?
v类加载器种类。
-
什么是双亲委派机制,为什么这么设计?
-
webView与js通信
-
如何避免WebView内存泄露
-
webView还有哪些可以优化的地方
-
Activity、View、Window 之间的关系。
-
说说Android的事件分发机制完整流程,也就是从点击屏幕开始,事件会怎么传递。
-
解决滑动冲突的办法。
-
Fragment生命周期,当hide,show,replace时候生命周期变化
-
Activity 与 Fragment,Fragment 与 Fragment之间怎么交互通信?
-
Fragment遇到viewpager遇到过什么问题吗?
-
ARouter的原理
-
ARouter怎么实现页面拦截
-
怎么应用到组件化中
-
说说你对协程的理解
-
说下协程具体的使用
-
协程怎么取消
-
具体有哪些启动优化方法?
-
分析启动耗时的方法
-
Activity、View、Window三者如何关联?
-
onCreate,onResume,onStart里面,什么地方可以获得宽高
-
为什么view.post可以获得宽高,有看过view.post的源码吗?
-
SharedPreferences是如何保证线程安全的,其内部的实现用到了哪些锁
-
是进程安全的吗?如果是不安全的话我们作为开发人员该怎么办?
-
SharedPreferences 操作有文件备份吗?是怎么完成备份的?
-
为什么需要插件化
-
插件化的原理
-
市面上的一些插件化方案以及你的想法
OK,点到即止。
如何进阶?
1、确定好方向,梳理成长路线图
不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。
关于这一点,在我当时确立好Android方向时,就已经开始梳理自己的成长路线了,包括技术要怎么系统地去学习,都列得非常详细。
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结:
2、通过源码来系统性地学习
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
《486页超全面Android开发相关源码精编解析》3、阅读前辈的一些技术笔记
《960全网最全Android开发笔记》4、刷题备战,直通大厂
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
总结
爱默生说:一个朝着自己目标前进的人,整个世界都给他让路。所以,作为现在的你,不惑很简单,多思考多规划,未来会更清晰,朝着自己的目标一步一步走下去,尽早地取得成功。毕竟,年龄在程序员界里,也是一种优势。
如果,你没有靠山,就让自己成为自己最稳的靠山吧!
以上文章中的资料,均可以免费分享给大家来学习,无论你是零基础还是工作多年,现在开始就不会晚。
以上内容均放在了开源项目:【github】 中已收录,大家可以自行获取(或者关注主页扫描加微信获取)。
网友评论