前言
2018年毕业于中南大学的计算机学院,大家可以叫我小吴,我呢毕业之后就一直在华为外包做Android开发,然后今年因为自己的一些原因打算离职到外面看看,那个时候我是投了超级多简历,然后去面试的有小红书啊、快手啊,爱奇艺啊,腾讯,小米.....等等很多的大厂,小厂然后下面这些嘞就是我和我同学每次面试后记录的一些面试官问我们的问题(ps:基本上特别的全面),我总结了一些给大家看一下。
简单粗暴的说:用最少的时间,最高效率,让你清楚:想要拿到Android工程师 offer你就要好好的看了
小红书 Android开发工程师
一面
- Java方面
1.静态变量和实例变量的区别
2.静态变量有static关键字修饰
3.静态变量不属于某个实例对象,而是属于类,也叫类变量,只要程序加载了类的字节码,不用创建任何实例对象就会被分配空间,就可以被使用,也就是说,你创建了多个对象,他们共用了一个静态变量,而实例对象是属于自己的独有的,不会被共享!(可以Class.var使用),位于方法区
4.实例变量必须创建对象后,才可以通过这个对象来使用。即new Class().var,位于堆区
5.“==” & equals()
6.浅拷贝 & 深拷贝
7.HashMap , 扩容机制
8.多个线程如果共享多个资源,需要怎么保证安全
9.volatile,CAS/ABA
- Android方面
1.事件的分发机制
2.Handler原理
3.TCP UDP
4.Kotlin和Java的区别
快手 Android开发工程师
一面:
- 一个平面上n个点,找出k条线穿过max点数
2.100位面试者,每人要四轮面试,怎么分配面试官
二面:
1.手撕:最长单调区间
2.Android/ 布局优化
3.Activity启动模式
4.RecyclerView和ListView区别
5.Handler机制,loop方法为何不会造成ANR
6.View绘制流程
7.SingleTop和standard启动模式下,生命周期回调有何不同
8.onStart和onResume区别
9.Java/ 面向对象三大特性
10.Array和Linked区别
11.HashMap底层
12.进程间通信方式
13.equals和==区别
14.线程间加锁的方式
15.知道啥设计模式
16.synchronized的不同使用
17.异常
18.线程池
19.创建线程的方式
20.OS/ 死锁
21.网络/ tcp和udp的区别
微信视频号安卓工程师
Android方面:
1.讲一下Android发生Crash的整体流程。Android在遇到非可检异常时就会触发该线程的 unCatchExcepttionHandler中的unCatchException()方法,最终在该方法的 process.kill()方法中杀死该进程,appCrash完成。
2.Native层Crash是如何捕获到的?Android NativeCrash发生时会向该进程发出错误的不可处理信号,Linux系统收到该信号后无法处理便会杀死进程,发生Crash。Android当中捕获的方法主要是使用了Linux系统下的核心转储机制,在发生Crash前系统会记录下当前的上下文信息,形成tombstone文件,存储起来,再杀死线程,这个tombstone文件就是我们要分析的对象。
3.Java层Crash是如何捕获到的?JavaCrash的捕获有几个关键部分
4.RuntimeInit类中的LoggingHandler类,用于打印日志时使用
5.RuntimeInit类中的KillApplicationHandler类,是一个系统默认的 UncaughtExceptionHandler,用于发生JavaCrash时kill掉进程
6.RuntimeInit类中的commonInit方法,其内部就是初始化了所有线程的set UncaughtExceptionHandler()。因此在发生非可检异常时,就会调用该线程的
UncaughtExceptionHandler.unCatchException方法,在该方法内部进行捕获。
7.如何做到发生异常时不会杀死APP?在
UncaughtExceptionHandler.unCatchException方法调用Looper进行死循环可以。
8.讲一下Handler机制
9.Looper的定时器是用如何实现的?通过nativePollOnce(ptr, nextPollTimeoutMillis);定时睡眠nativeWake(mPtr);进行唤醒
10.APK包里有什么?主要有5个部分:
dex文件:.class文件编译后的产物
Assets:资源文件,如图片等,主要是通过AssetsManger来进行加载。
Resource:资源文件,layout等,通过R.xxxxxx.id来进行引用
Library:so库引用目录
META-INF:APK 签名有关的信息
11.APP在运行时是通过什么来获取到layout文件的?
12.讲一下surfaceview跟textview。
13.Activity A 启动 Activity B 时,他们在同一个栈的情况下生命周期以及执行顺序是怎么样的?
14.Destroy()方法是什么时候调用的?
15.调用finish()方法。
16.Handler中已经没有要处理的message。 满足这两个条件才会调用。
Java方面:
1.有什么线程同步的机制?
2.volatile关键字讲一下。
3.volatile如何实现可见性?
4.synchronize如何实现可见性?
5.volatile防止指令重排代码级别如何实现?
操作系统的理解:
1.讲一讲操作系统内核态跟系统态的了解。
2.操作系统内核是什么?
3.操作系统内核本质上就是操作系统代码的常驻机构。
4.操作系统内核就是管理所有代码和数据结构的集合。
5.操作系统内核是软件和硬件之间的媒介。
6.为什么操作系统要有内核态、系统态的存在?
7.Linux有什么信号?
8.sigill信号在什么情况下会触发?
算法题:
1.给一个数组,每个值表示的是在坐标系中的点下标,找出该数组在组成的最长直线为多少,相同最长长度直线有几条?
2.给一段数字,给出其可能组成的所有IP地址。
小米 android开发
1.http与https的区别。
2.Java构造器工作工程。
3.Java中的引用类型有哪些。
4.http,http1.1,http2.0有啥区别。
5.TCP/IP最大容量的意义是什么?
6.还有Integer与int类型区别?各自怎么比较大小?
7.还有垃圾回收机制还有final的用法
8.为什么HashMap在1.8中采用了红黑树?你能说下啥是红黑树吗?啥是平衡二叉树?啥是二叉搜索树?啥是满二叉树?
9.Java1.7采用数组加链表与1.8采用红黑树有啥区别?
10.HashMap 线程不安全原因是啥?分版本作答
11.如果线程安全的话 要用哪个?我说Hashtable。他说HashTable效率太低,怎么安全又效率高?
12.对称加密与非对称加密?
13.SSL是干嘛的?
美团app android开发工程师
一面
1.jvm内存模型
2.new 对象的过程
3.类加载过程
4.ClassLoader源码
5.final关键字
6.匿名内部类
7.讲下垃圾回收算法
8.LinkedList && ArrayList
9.hashMap
10.常用注解,spring中的注解
11.锁,synchronized底层原理
12.https && http
13.浏览器输入地址后的过程
14.状态码 303 304
15.你知道的设计模式
16.单例模式 说了双重校验锁,静态内部类 ,不同场景下如何选择
17.双重校验锁为什么要两次判空
18.volatile,指令重排
爱奇艺 Android开发工程师
一面:
1.介绍项目
2.Android布局嵌套深有什么问题
3.kotlin协程
4.HashMap原理
5.算法:手写快排
二面:
1.Activity启动模式
2.Activity A → B的生命周期在这四种启动模式下的状态
3.广播类型
4.有序广播如何实现的按顺序收到广播
5.持久化存储方式
6.SharedPreferences的格式
7.xml解析方式
8.json与xml的区别,json为什么比xml更好
9.Android view绘制流程
10.surfaceView
11.sp, dp, px的区别
12.机型大小适配
13.适配语言
14.ANR 什么时候出现,如何排查
15.Android动画
16.startService与bindService的区别
17.Service保活方式
18.java泛型,<? extends T>能否add元素
19.重写equals方法需要重写hashCode方法吗
20.ThreadLocal
21.wait,sleep,yield,join的区别
算法1:
1.字符串全排列
算法2:
1.删除链表中倒数第n个节点
字节跳动旗下的抖音短视频Android开发工程师
一面:
1.项目
2.volitale与synchronized的区别
3.手写单例
4.匿名内部类如何持有外部类对象
5.内存泄漏的概念
6.内存泄漏的场景
7.内存泄漏检测的工具
8.handler原理,sendMessage与sendMessageDelay如何保证Message放入MessageQueue中的顺序
9.两个Message相隔5秒,这5秒内线程会一直阻塞吗
10.自定义 View如何特殊处理wrap_content,padding的实现
11.MVVM和MVP 的区别(引出了一系列问题,不是很了解就直接说不了解比较好)
12.LiveData与RxJava的区别
13.LiveData生命周期感知如何实现
14.介绍RxJava
15.https与http的区别,中间人如何修改密钥
16.算法:二叉树z字形打印
二面:
1.项目
2.final、finally与finalize的区别
3.java开启一个线程的方式
4.Thread.start()与直接调用run()的区别
5.Java默认提供了几种线程池
6.thread{ i++ }执行10次结果,如何让i最后等于10
7.synchronized与reentrantlock区别
8.死锁
9.悲观锁乐观锁
10.gc垃圾回收
11.垃圾标记阶段,Python如何实现的断开循环引用
12.Retrofit返回的是什么数据类型
13.服务器返回的数据有哪些类型,为什么不能用xml类型返回
14.请求数据这个过程发生了什么
15.get与post请求的区别,get与post携带数据的区别
16.java注解
17.kotlin扩展函数原理
18.算法:两个链表相加
三面:
- main方法执行之前发生了什么
public class Main {
public static void main(String[] args) { System.out.println(Main.class.getName());
}
}
- System.out.println(“a”)将字符输出到屏幕发生了什么
- 双击QQ发生了什么
- 浏览器输入url发生了什么
- 根据前序遍历和中序遍历输出后序遍历
- 如果排期只有一周的任务,但是以我的能力需要两周才能完成,这个时候你会怎么办。
- k个一组反转链表
字节跳动旗下的抖音电商相关 Android开发工程师
一面:
1.实习学到的架构
2.MVVM
3.Dagger原理
4.livedata原理
5.进程和线程
6.操作系统IO模型
7.进程通信方式
8.管道通信原理
9.TCP协议如何实现可靠传输
10.UDP如何实现可靠传输
11.java创建线程
12.线程池原理
13.线程池拒绝策略
14.synchronized与reentrantlock实现方式的区别
15.AQS原理
16.handler原理
17.Retrofit原理
算法:
1.二叉树右视图 — 非递归实现
二面:
1.Navigation的优缺点
2.如何实现的自定义navigate方法切换fragment,如何让被覆盖的fragment感知到生命周期
3.gc如何判断垃圾对象
4.成员变量与局部变量的区别,局部变量的值一定是存放在堆中吗()
5.jvm类加载的时机
6.jvm类加载过程
7.双亲委托机制是什么
8.双亲委托机制什么时候会被破坏
9.内存泄漏是什么
10.volatile的作用
11.写一个死锁
12.算法:判断A是否是B的子树
三面:
1.自己是如何学习Android的
2.实习过程中做的需求说一下
3.实习过程中的难点说一个
4.实习过程中和哪些人接触的比较多
5.如何和别人沟通的
6.实习的收获
7.挑一个项目说一下
8.里氏替换原则
9.http状态码
10.http多路复用
11.数据库
12.拿了哪些offer
13.算法 汉字表示的数字转成阿拉伯表示。
我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。其实我觉得技术面试是一个让我们认识自己的一个过程,让我们知道现在招聘这个岗位的要求差距和我们差多少。
更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 去发现对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有问题了,要去试图了解他的工作内容、了解这个团队的工作氛围。
找工作无非就是看这三点:做什么事,和什么人,给多少钱,要给这三者在自己的心里有那么一个划分。
为了帮助大家更快更好的掌握大厂 Android 面试那些深坑套路,特地整理这套《2022年金三银四面试专题—直击大厂面试套路手册》,如果你有需要这份手册的完整版,可以 点击这里查看获取方式 传送门直达!!!
内容展示
无论是你短期内想提升 Android 内功实力, 突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这中间有所收获。
为便于你理解,我会采用“知识点 + 项目实践”的讲解方式,侧重总结工作上的实践经验,并和你分享一些疑难问题的解决思路,让你在以后的工作中,能够有方法论的指导。
总结
Android 工程师的竞争环境越来越激烈,但 Andorid 开发仍然是一个刚需的工种,行业对人才的需求从未终止,但与此同时也对我们提出了更高的要求。如果你仍然只是在日常开发过程中复制粘贴,或者仍以完成一个项目需求为唯一目的,只是掌握了如何去调用某个 API 或者数据结构来实现某个功能,已经不能算是合格的工程师了。
对于 Android 开发者来说,要成为优秀的 Android 开发工程师,不只能够让你在工作中更加游刃有余,同样会让你在职业发展中面临更多优质的机遇。而一个初中级 Android 工程师在通往高级甚至是资深工程师的发展过程中,我认为这份Android面试指导手册中超过 90% 的内容都是你必须掌握,且无法绕过的。如果你有需要这份手册的完整版,可以 点击这里查看获取方式 传送门直达!!!
网友评论