Android开发三年半5月份离职,面试10家公司后,这些面试官常问的面试题一定要了解!

Android开发三年半5月份离职,面试10家公司后,这些面试官常问的面试题一定要了解!

个人说明

大家好,在跟大家讲述自己的面试经历,以及遇到的面试题前,先说说几句题外话。

接触Android已经3年半,在工作中遇到疑难问题总是在网上博客上搜索答案,各位大牛大神总是把自己的经验分享出来,帮助我们这些需要帮助的人,由此表示衷心感谢!然而现在自己细想了一下,自己也是时候把遇到的问题并把解决方案分享出来,希望能帮助到有需要的人。

随着时间的流逝,很多人说互联网这一块已经越来越不好干了,因为烧钱时代已经过去,剩下的都是根基牢固的大公司,独角兽已经不复存在。这就直接导致了互联网岗位的下降,本人亲测,也的确如此。

2020.05月,本人离职(此时3年半工作经验,深圳就职),开始试水安卓市场,寻求一份合适自己,稳定的中大型公司。投了很多公司,面试机会并不是我想象中的那么多,即时面试过程顺利,也没有获得offer(候选人太多太多)。不过借此机会,前前后后我面了10家公司,现在就把我遇到的面试题,并且提供一些面试技巧给各位即将面试的同志们。

OK,进入主题,请看Android知识图谱

Android开发三年半5月份离职,面试10家公司后,这些面试官常问的面试题一定要了解!

面试,无非都是问上面这些问题(挺多的 - -!),聘请中高级的安卓开发会往深的去问,并且会问一延伸二。以下我先提出几点重点,是面试官基本必问的问题,请一定要去了解!

  • 基础知识 -- 四大组件(生命周期,使用场景,如何启动)
  • 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方向时,就已经开始梳理自己的成长路线了,包括技术要怎么系统地去学习,都列得非常详细。

Android开发三年半5月份离职,面试10家公司后,这些面试官常问的面试题一定要了解!

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

最后我在这里分享一下这段时间从朋友,大佬那里收集到的一些2019-2020BAT 面试真题解析,里面内容很多也很系统,包含了很多内容:Android 基础、Java 基础、Android 源码相关分析、常见的一些原理性问题等等,可以很好地帮助我们深刻理解Android相关知识点的原理以及面试相关知识

这份资料把大厂面试中常被问到的技术点整理成了 PDF ,包知识脉络 + 诸多细节;还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

以上内容均放在了开源项目:github 中已收录,里面包含不同方向的自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

总结

爱默生说:一个朝着自己目标前进的人,整个世界都给他让路。所以,作为现在的你,不惑很简单,多思考多规划,未来会更清晰,朝着自己的目标一步一步走下去,尽早地取得成功。毕竟,年龄在程序员界里,也是一种优势。

如果,你没有靠山,就让自己成为自己最稳的靠山吧!

以上文章中的资料,均可以免费分享给大家来学习,无论你是零基础还是工作多年,现在开始就不会晚。