Android 面试反思:开发 5 年 crud 背景,惨遭字节阿里双挂,网站开发前后端分离
算法:
给定一个数 N 如 23121 给定一组数字 A 如{2,4,9}; 求由 A 中元素组成的、小于 N 的最大数,如小于 23121 的最大数为 22999
涂鸦智能(现场面试两轮)
一面
讲一下 Handler 消息机制
项目中都做了哪些性能优化
讲一下绘制流程 View 和 ViewGroup 的区别
事件分发流程是怎么执行的
http 的请求过程
HashMap 原理 put 过程、扩容 1.7 1.8 区别 ConcurrentHashMap 原理
二面
MQTT 协议的特点 底层原理
Activity 启动流程 为什么 zygote 使用 socket 通信
插件化原理 遇到过什么问题 怎么解决的
classLoader 双亲机制
模块化通信 自己设计一套怎么实现
tcp 协
议请求过程
面试结束后已经中午吃饭了 面试官让等一会 结果又让等通知
等了有一个星期邮件通知感谢
阿里(三面挂)
初面(电话简单聊了二十分钟)
项目经历 主要做过哪些业务功能
性能优化
有遇到过哪些比较难的问题
讲一下 MQTT 协议
注解和反射原理
HashMap 内部实现原理 怎么 hash 的 怎么扩容 1.7、1.8 什么区别 多线程会导致什么问题
项目中人脸识别用到了哪些业务场景
这一面应该是筛选下简历 不算正式面世
一面(电话面试四十分钟)
介绍自己做过的项目 处理了什么问题
ListView 和 ScrollView 的冲突怎么处理
Handler 怎么处理延时消息的 消息队列中死循环在 native 层都做了什么处理
为什么用单 Activity 多 Fragment 怎么处理传参
同事代码可能导致内存泄漏和 ANR 在代码层面怎么避免
okhttp 拦截器实现 连接池的复用策略 有实现 http2.0 吗 okhttp 和 volley 的区别 从实现策略讲
讲一下 eventbus 实现原理
glide 的三级缓存是怎么执行的 最近使用和正在使用的缓存是怎么切换的 怎么处理 bitmap 复用的 如果自己实现一个该怎么处理
模块化怎么通信 底层怎么实现
二面(电话面试三十多分钟)
介绍项目 自己处理过哪些项目痛点 怎么处理的
泛型编译期信息怎么储存的 什么情况下泛型会擦除
MVP、MVVM 优缺点
与 web 是怎么交互通信的 这个模块怎么设计的
接口 抽象类区别 可以 new 吗
JDK8 的流有用过吗 解决了什么问题 写过接口的默认实现吗
讲一下 RN 和 Flutter 的区别
算法:查找数组中大小为 x 的两个数(只有一对)
三面(三十多分钟)
介绍做过的项目 处理过哪些问题
http2.0 什么特性 有哪些问题
设计模式了解多少 讲一下装饰模式
MQTT 协议解决了哪些问题 为什么
flutter 了解多少
平时都通过哪些方式学习和了解技术的
都有了解其他哪方面的技术
在最近的项目中学到了什么
职业发展方向
对于这项工作你有什么优势
中间废话有点多 面试官有点不耐烦 说尽量讲的简单些
第三天就收到邮件感谢了 -。-
阿里整体的面试难度不算太离谱,可能刚好都是比较擅长的,但面试周期较长,面到三面的时候已经多半个月了,有点力不从心;也有自己没有准备好的原因,有点懈怠了,三面问的问题大白话的偏多,奈何本人嘴笨,血压逐渐拉满,不过也算没有遗憾,深知能力有限,就酱吧~
整理了下其他面试中都涉及过的问题
网络
http 请求、tcp 握手回收、MQTT 相关
数据结构
树、链表
Java
GC、Collection、Map
多态
多线程、各种锁机制
Android
性能优化、ANR、内存泄漏
Activity 启动模式、启动流程
四大组件
Hanlder 机制、事件分发、绘制流程
MVP、MVVM、插件化(hook)
跨进程通信、aidl、广播、ContentProvider
okhttp、retrofit、glide、eventbus 底层原理
Kotlin
kotlin 反射、kotlin 泛型
协成原理 await、async 区别
lateinit 和 by lazy 区别
很多技术细节,工作中用不太到,但是面试不得不去准备,还是要把基础打牢固,下面就分享一些我梳理的一些 Android 基础相关知识:
关于一些基础知识的梳理
Java 基础:
1.ArrayList、Linkedlist、Vector
2.BlockingQueue、CountDownLatch
3.Collections、Arrays
4.Exception 与 Error 包结构,OOM,SOF 的各种情况
5.HashCode 作用
6.Java1.7、1.8 新特性
7.Java NIO
8.Java 基本数据类型以及相关操作
9.Java 的四种引用,强弱软虚,用到的场景
10.Map、Set、List、Queue、Stack 的特点与用法
11.Map 相关子类区别
12.Object 共有方法以及 wait 和 sleep 区别
13.Override 与 Overload 区别
14.String 相关内容学习
15.foreach 与 for 循环效率对比
16.interface 与 abstract 类的区别
17.static 关键字
18.synchronized、lock、reentrantLock 区别
19.不同清醒下 return 与 finally 的执行顺序
20.transient、volatile
21.反射原理及应用
22.反省特点以及类型转换
23.生产者消费者问题的五中实现
24.县城以及 ThreadLocal
25.线程池的使用
26.解析 XML 的 DOM 与 SAX 以及 PULL 区别
27.锁的等级:方法锁、对象锁、类锁
28.面向对象的特征和含义以及多态实现原理
Android:
1.在 AS 中定义 Gradle 插件
2.Activity 与 Fragment 生命周期
3.Activity 卡顿原因
4.Activity 启动过程
5.Activity 四种启动模式与 IntentFilter 匹配规则
6.Activity 的状态保存
7.Android5.0、6.0、7.0、8.0、9.0、10.0 特性
8.Android 内存优化方法
9.Android 动画
10.Android 文件缓存方法
11.Android 长连接,怎么处理心跳机制
12.Asset 与 raw,res、drawable
13.AsyncTask 原理与使用
14.Bitmap 相关
15.ContentProvide 用法
16.IntentService
17.Json 相比 XML 优劣势,protobuf
18.Looper、Handler、MessageQueue
19.Merge 与 ViewStub 布局标签
20.OkHttp 原理解析
21.Service 相关
22.Sqlite 基本操作
23.UIL 原理解析
24.Volley 原理解析
25.Zygote 进程启动过程
26.启动 Activity 的集中方式
27.如何保证 Service 不被 kill
28.如何加速启动 Activity
29.怎样退出终止 App
30.插件化原理
31.注册广播的两种方式
32.热补丁技术概括
33.自定义 View(所有 View 知识)
34.通过自定义 Gradle 插件修改编译后的 class 文件
数据结构:
1.各种排序算法复杂度对比
2.排序算法
3.数据结构基本概念及复杂度分析
操作系统:
1.IPC 集中通信方式
2.什么是虚拟内存
3.死锁的必要条件,怎么处理死锁
4.段储存、页储存、段页储存
5.虚拟地址、逻辑地址、线性地址、物理地址的区别
6.进程与县城
7.银行家算法
评论