年后想跳槽找工作的,来看看这份Android 中高级面试题大全,面试建议+系统复习路线!

最近整理了一波面试题,包括安卓JAVA方面的,目前大厂还是以安卓源码,算法,以及数据结构为主,有一些中小型公司也会问到混合开发的知识,至于我为什么倾向于混合开发,我的一句话就是"走上编程之路,将来你要学不仅仅是这些,丰富自己方能与世接轨",做好全栈的装备。

金三银四,很多同学心里大概都准备着年后找工作或者跳槽。最近有很多同学都在交流群里求大厂面试题。正好我电脑里面有这方面的整理,于是就发上来分享给大家。

一、网络面试题

1、HTTP 协议
2、TCP/IP 协议
3、TCP 的三次握手与四次挥手理解及面试题
4、网页中输入 url,到渲染整个界面的整个过程,以及中间用 了什么协议?
5、TCP 和 UDP 的区别?
6、HTTP 的几种请求方法具体介绍
7、HTTP 请求和响应报文的格式,以及常用状态码
8、一个 TCP 连接上面能发多少个 HTTP 请求

二、数据结构与算法面试题

1、常用的数据结构有哪些?
2、数组
3、链表
4、队列&堆栈
5、二叉树
6、HashMap
7、图
8、排序算法有哪些?
9、查找算法
10、串
11、其他算法(对称加密算法,数组哈希)

三、Java 面试题

1、HashMap
2、ArrayList
3、LinkedList
4、Hashset 源码分析
5、内存模型
6、垃圾回收算法(JVM)
7、垃圾回收机制和调用 System.gc()的区别?
8、类加载过程
9、反射
10、多线程和线程池
11、创建多线程方式、线程池工作原理
12、设计模式(六大基本原则、项目中常用的设计模式、手写单例等)
13、断点续传
14、Java 四大引用
15、Java 的泛型
16、final、finally、finalize 的区别
17、接口、抽象类的区别
18、从 java 容器类的设计讨论抽象类和接口的应用
19、synchronized 和 lock 的区别

四、Android 面试题

1、Activity 启动模式
2、Activity 的启动过程
3 、进程通讯
4、Android Binder 之应用层总结与分析
5、进程保活方法
6、从源码了解 handler looper ,messageQueue 思路
7、handler 如何实现延时发消息 postdelay()
8、Android 中为什么主线程不会因为 Looper.loop()里的死循 环卡死?
9、RxJava 原理及如何封装使用
10、okhttp 源码分析
11、retrofit 源码分析
12、LeakCanary 核心原理源码浅析
13、LruCache 使用及原理
14、ARouter 原理
15、注解框架实现原理
16、Android 如何编写基于编译时注解的项目
17、RxJava2+Retrofit2+OkHttp3 的基础、封装和项目中的使用
18、Rxjava2.0+Retrofit+Okhttp(封装使用)+MVP 框架搭建
19、Android 插件化和热修复知识梳理
20、Android 开发中比较常见的内存泄漏问题及解决办法
21、如何检测和定位 Android 内存泄漏
22、图片占据的内存算法
23、为什么图片需要用软引用,MVP 模式中的 view 接口用弱 引用
24、基于 DataBinding 与 LiveData 的 MVVM 实践
25、App 稳定性优化
26、App 启动速度优化
27、App 内存优化
28、App 绘制优化
29、App 瘦身
30、网络优化
31、App 电量优化
32、安卓的安全优化
33、为什么 WebView 加载会慢呢?
34、如何优化自定义 View

给大家3个走心的面试建议

经常会有朋友粉丝私聊我帮他看下简历,发现了一些共性问题;除此以外,我偶尔面试一些人,有一些个人的感受分享给大家。

简历信息要直观

简历首先要经过 HR 这一关,HR一般情况下是第一个决定你简历是否能往下投递的人。

所以,我们首先需要站在他们的立场,思考他想看到什么就行了。

对于基本信息:毕业院校,毕业时间,联系方式这些核心信息我们就不赘述了。

我见过一个简历上面的项目经历,项目名大概是这样的

  • 2016-2017 BBV线上项目
  • 2017-2018 功夫线上项目

扫了一眼,完全不知道是什么项目。

你不能预期HR去花时间读你简历中的项目介绍,去推断你这个项目的类型...

于是我咨询后发现,BBV是个区块链app,功夫是个餐饮类app。

那么你不如就修改为下面的写法,更加直观:

  • 2016-2017 区块链app (BBV)
  • 2017-2018 餐饮类app (功夫)

知名项目除外,不要参考这一条。

简历上表达出专业技能

1. 方便 HR 查看技能匹配度

任何面试岗位都有要求,部分 HR 也会关注简历与发布岗位的匹配度的。

这里也有个小技巧:你可以灵活的匹配这个岗位的要求(但不要把不会的写上去)。

2. 面试问题的主要来源

面试官,主要通过交流、提问,来确定你的技术深度、广度,以及对该岗位的匹配程度。

那么,提问问题哪来呢?

当然是从你的简历内容中来。

所以你简历中要明确表现出专业技能的掌握情况:

例如这样:

专业技能

  • 熟悉Android热修复、插件化、dex,arsc等相关技术
  • 熟悉Android 常规的事件分发、自定义控件、动效等相关
  • 熟悉面向对象,在意封装、继承,和接口设计
  • 熟悉Android性能优化常规手段,有一定的实战经历
  • 熟悉Android 四大组件相关framework代码
  • 熟悉编写gradle plugin,有一定的实战经历
  • 熟悉Https在Android上的适配、以及应用防破解相关知识
  • 了解NDK开发,有过一点JNI开发经验

如果你项目比较出彩,也可以将专业技能拆分到项目介绍中去。

这样你可能会遇到一个很 nice 的面试过程:

A:看你做过XXX,说说怎么实践的。
B:我在项目中这么实践的,而且遇到过以下几个问题,是这么解决的。
A:我也遇到过,我是这样解决的,不过感觉你的方案好像也不错。
AB: 开心的深入交流下去。
...

但是,如果你没有写专业技能。

那么遇到好点的面试官,可能会跟你交流项目,从你的陈述中去确定你用到哪些技术才能进行发问。

当然,很多时候面试还挺紧张,一问一答,项目介绍也很简单就过去了。

面试官就很郁闷了,问啥呢?

那只能问他比较熟悉的东西了,可能面试官主要是做插件化相关的,而你主要是做组件化相关的,这种情况就可以能造成你俩不在一个频道了,非常吃亏。

很可能面试流程就变成了:

A:你有没有做过 XXX。
B:没做过。
A:那你有没有做过 XXX。
B:没做过。
A:(内心)这B到底做了哪些事...
B:(内心)问的什么屌问题...
...

当然,千万不要写自己没有深入了解过的技能,凡是你列出来的,会默认你对此有掌握有一定的深度,而不是被提问时,回答:

这个我就用了一下...
这是我同事接进来的...
源码我还没来得及看...

对于第三库原理回答要有针对性

对于回答问题,在回答出问题的同时,尽可能关联到自己所经历的具体的项目场景

下面我说一个真实的体验,关于第三方库原理,基本上面试都会被问到。

比如问你图片加载框架 freso 的原理:

有的同学回答是这样的:

首先根据 url,看看有没有缓存,有缓存从缓存中取,没有 build 一个 request,放到线程池执行。

乍一听好像也没错,但是,任何一个完备的图片加载框架不都有这个流程么。

所以,问你一个开源库,除了回答基本原理流程,你心里要明确知道这个库的核心架构与特点,设计的比较好的地方,可以扩展的地方。

如果项目中还针对做过优化、监控等就更好了。

比如刚才问到的 fresco:

  • 你可以说说他的整体设计架构;
  • 你可以说说他的图片内存管理机制,在不同的版本手机上,然后深入下去;
  • 你可以说说他的Producer/Consumer 机制,以及如何利用这个机制去做扩展,项目中的定制;
  • 你可以说说根据自己业务情况做了哪些优化;
  • 甚至说一些它的缺点;
  • ...

所以,对于第三库的原理,希望你能掌握:

  1. 基本原理流程;
  2. 整体的架构设计;
  3. 做的比较好的地方,以及这些地方设计与原理;
  4. 结合项目的定制、优化、扩展;

其实这个建议,也能反推出另一个问题:

如何学习开源项目源码?

很多同学学习一个开源库源码,花费了非常大的力气去梳理代码执行流程,然后终于衔接起来,长舒一口气就结束了,那么就有点可惜了。

根据上面建议的回答可以看出来,梳理清楚执行流程只是第一件事。

你要去深入发现:

  1. 核心的架构设计是什么样子的?
  2. 和其他类似开源库相比有什么优势?
  3. 这些优势是如何做到的?
  4. 哪些部分可以定制,方便我们日后进行扩展?

最后,虽然有很多优秀的简历模板,各种面试技巧,但是千万不要舍本求末,始终要牢记个人履历才是关键,希望大家随着工作年限的增长,履历也越来越丰富。

希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。

最后分享一个面试系统复习路线

有时候,选择比努力更加重要,机遇比奋斗更加重要。但是,机会只留给有准备的人。我们只有时刻准备着,才能在机会到来的时候,去抓住它。

这里给大家分享一下我的面试复习路线,有需要的朋友可以参考一下:

1、看视频进行系统学习

前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

2、进行系统梳理知识,提升储备

客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

系统学习方向:

  • 架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO

  • Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化

  • 360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化

  • 解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack

  • NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发

  • 微信小程序:小程序介绍+UI开发+API操作+微信对接

  • Hybrid 开发与Flutter:Html5项目实战+Flutter进阶

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

3、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

4、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容

猜你喜欢

转载自blog.csdn.net/weixin_44339238/article/details/112845623