Android茫茫半年求职路,终于斩获三个大厂offer

Android茫茫半年求职路,终于斩获三个大厂offer,第1张

概述前言2019年底,公司出现危机,开始“优化”,本组一个小兄弟被“优化”,于是我也着手开始做准备,将来若轮到我被“优化”,出去面试时也好打个有准备的仗。这里我可以交代一下,我从四月份开始准备面试,复习知识点,金九银十开始去面试到拿到3个大厂offer(京东、字节跳动、滴滴),大概是半年时间,时 前言

2019年底,公司出现危机,开始“优化”,本组一个小兄弟被“优化”,于是我也着手开始做准备,将来若轮到我被“优化”,出去面试时也好打个有准备的仗。

这里我可以交代一下,我从四月份开始准备面试,复习知识点,金九银十开始去面试到拿到3个大厂offer(京东、字节跳动、滴滴),大概是半年时间,时间跨度比较的长,大概参与了二三十家公司的面试,因为基本上是骑驴找马,并不急,我只想拿到大厂的offer。

准备

主要是明确自己想要加入的公司,并开始做技术准备,狂刷面试题。目标公司是BAT,我需要到更大的平台和更优秀的人做更好的项目,正常来说加入BAT以后可以让自己的实力和眼界得到提升,并且有一线大厂的光环对以后都是蛮重要的。

有人说去哪里都一样,去了大厂也是个螺丝钉,我想说我宁愿做航空母舰上的螺丝钉也不愿意做拖拉机上的螺丝钉。其实在求职的过程中一次又一次的失败曾经让我放弃BAT了,转而投向其他我认为有前景的公司,不过我还是非常想去BAT!做梦都想去。

常考知识点1、Java

讲下equals和hashcode,他们为何必须一起重写?hashcode方法重写规则。

HashMap相关。

@H_403_26@①HashMap添加元素的过程,hash方法细节;扩容的触发条件、扩容过程中是数据是整体复制么?链表转红黑树的阈值为何是8,红黑树转链表的阈值为何是6,为何不上同一个阈值?链表为何要转红黑树?红黑树有何特性?hashmap为何如此设计?
②对应的并发容器。Hashtable以及ConcurrentHashMap实现细节,优劣势; 如何使现有的HashMap线程安全?(Collections#synchronizedMap)

运行时数据区域分区,哪些线程私有,哪些线程共享。栈帧的数据结构。方法区存放哪些数据。

简单描述一下 Person person = new Person() 对象实例化过程。最好有类加载过程。

GCRoot的类型,举例说明。

LRU的实现。让你自己实现一个,你会怎么做。

线程的几种状态。

线程池。

线程池中的任务可以实现按照优先级执行么,如何实现?(优先级队列)

线程池的设计用到了那种设计思想?(生产者消费者模型)

何为阻塞队列?

你是如何配置线程池的?核心线程数你一般是怎么配置的?

T1、T2、T3三个线程,如何保证它们顺序执行?也就是异步转同步的方式。

Java中 wait和sleep方法的不同?(wait释放锁,sleep不会释放锁)

线程安全相关。

锁。synchronized、volatile、Lock。锁的几种状态。CAS原理。

为什么会有线程安全?

Java中如何保证线程安全?

synchronized和Lock的使用、区别及底层实现;volatile的作用和使用方式;常见的原子类。

synchronized中的类锁和对象锁互斥么?

讲下Java的双亲委派。

泛型。

反射。

注解。

由于篇幅有限,仅展示部分内容,所有的知识点 整理的详细内容都放在了我的【GitHub】,有需要的朋友自取。

2、AndroID启动模式,以及常见用法。

①举例说明
②taskAffinity,allowTaskReparting的用法。
③有没有遇到哪些诡异的现象?如何解决的?

Activity生命周期。

①常见生命周期方法
②A启动B的,然后按back键,执行了哪些方法?如果是A启动B的,然后按home键呢?
③onSaveInstance方法调用时机。

Bitmap内存优化。

①Bitmap内存如何计算?如何在不改变图片质量的情况下优化?Bitmap内存复用(Options.inBitmap)
②超大图加载(BitmapRegionDecoder)
③跨进程传递大图(Bundle#putBinder)

xhdpi的图片分别显示到hdpi和xxhdpi的手机上,显示的大小和内存是怎样的?

资源文件加载规则。比如说图片存放在drawable-hdpi和drawable-xxhdpi下,xhdpi的手机会加载哪张?如果删除掉drawable-xxhdpi下的图片呢?

AndroID的进程间通信方式。

①AndroID为何要自己搞一个binder,使用linux原有的通信方式不行么?(安全、性能好,方便易用)
②binder通信的内存大小限制。(1M和128k)
③binder的架构(Application、ServiceManager、系统Service、binder驱动),以获取系统服务的过程举例分析。
④Application#onCreate里面可以使用binder服务么(可以)?Application的binder机制是何时启动的(zygote在fork好应用进程后,会给应用启动binder机制)?binder机制启动的几个关键步骤。
⑤binder线程池默认最大数量(15)?
⑥binder和AIDL。
⑦oneway。

谈谈你对AndroID中Context的理解?四大组件里面的Context都来源于哪里。

Application启动流程。

①AMS是如何确认Application启动完成的?关键条件是什么(zygote返给AMS的pID;应用的ActivityThread#main方法中会向AMS上报Application的binder对象)?
②Application#constructor、Application#onCreate、Application#attach他们的执行顺序(132)。Activity和Service呢?

startActivity的具体过程。

Activity#setContentVIEw的具体过程。

①PhoneWindow是何时创建的,它的作用是什么?
②setContentVIEw中传递的资源文件是如何变成VIEw对象的?
③布局文件对应的VIEw对象是添加到哪里的?
④Activity的布局是何时显示出来的?
⑤VIEwRootImpl是何时初始化的?它的作用是什么?
⑥Choreography了解么?作用是什么?

Surface的作用是什么?它是何时初始化的?VIEw绘制的数据是如何显示到屏幕上的?

Handler机制:

①应用层,消息的发送、接收、获取和处理;消息是如何存储的?延时消息一定准时么?是如何保证延时时间的?Handler#dispatchMessage细节,如何使用?
②Handler的Framework层。Looper#loop方法为何不会导致ANR?nativePollOnce细节。eventfd和epoll机制了解么?
③IDleHandler了解么?合适调用?如何使用?靠谱么?
④handler里面消息有几种?普通消息、同步消息、消息屏障。如何使用?如何区分普通消息和异步消息?
⑤如何实现给Handler发送一个Runnable,又不通过Handler#post(Runnable run)这个API?(Message#obj属性,或者通过反射设置Message#callback属性)
⑥Message#obtain实现细节了解么?为何要池化?最大限制容量是多少?

ThreadLocalmap的实现。

VIEw绘制流程

①onMeasure、onLayout、onDraw
②MeasureSpec为何如此设计?
③子VIEw的LayoutParams来源。VIEwGroup#addVIEw(vIEw)这种添加vIEw的方式,没有给子VIEw设置LayoutParams,那么LayoutParams是谁设置的?
④onMeasure和onLayout为何会执行两次或多次?
⑤VIEw#draw方法细节。
⑥VIEw绘制这一块遇到过什么问题么?如何解决的。

自定义view有哪几种方式?注意事项。你对自定义属性如何理解?

事件分发。滑动冲突如何解决,具体在哪个方法里面解决?如何判断滑动方向?

Apk打包流程。R文件最终会生成什么文件?aapt的作用是什么?

LocalbroadcastReceiver,为何比broadCastReceiver速度快,LocalbroadcastReceiver的实现。

RecyclerVIEw的缓存。RecyclerVIEw的优势是哪些?都用它做过什么功能?

讲下leakCanary原理。为什么不用虚引用?引用队列里面存的是什么?内存数据是如何dump出来的?

讲下Okhttp的实现。拦截器的顺序,网络拦截器和普通拦截器有什么区别?它的线程池是怎样的?如何管理的?

glIDe的三级缓存如何做的?

rxjava的原理。rxjava的线程切换如何实现的?map和flatmap *** 作符区别;zip和merge *** 作符区别。

ArrayMap和SparseArray的作用和实现细节。

组件化和模块化的区别。

mvp、mvvm。

jetpack组件。

gradle中task的生命周期。

插件化原理。

热修复原理。

由于篇幅有限,仅展示部分内容,所有的知识点 整理的详细内容都放在了我的【GitHub】,有需要的朋友自取。

3、AndroID性能优化

启动速度优化。冷启动、温启动、热启动了解么。

内存优化

卡顿优化

网络优化

数据库优化

内存泄漏优化

包体积优化

有需要的朋友【点击我】免费获取。

4、http相关

描述一个完整的网络请求流程。

TCP和UDP区别,三次握手与四次挥手的细节;为何建立链接需要三次,断开链接却需要四次。

http和https区别。https的链接过程?

断线续传如何实现。大图分段上传如何实现。关键步骤

分段下载如何实现。

请求重试机制如何实现。

5、设计模式

你熟悉哪些设计模式?请举例说明。为何选用这个设计模式。

策略模式和桥接模式的区别

6、kotlin

说一下kotlin的优缺点。let和with的区别

扩展函数

kotlin的lateinit和by lazy的区别

构造函数有哪几种

协程

7、Flutter

Flutter的isolate

Flutter的优势和劣势

Flutter的channel通信方式有哪几种?

Flutter的包体积优化

Flutter中State的生命周期,dIDUpdateWidget方法何时调用

8、项目相关

选一个你最熟悉的项目讲解下。

讲一下你的技术栈

你最自豪的项目或者片段

你最擅长哪些部分

你的上份工作经历中,最大的收获是什么?

你的职业规划

面试进行时1、滴滴一面

1、VIEw绘制流程。onMeasure、onLayout、onDraw。
2、竖向的TextVIEw如何实现。TextVIEw文字描边效果如何实现。
3、事件分发。冲突解决。
4、动画
5、RecyclerVIEw的特点和缓存
6、SparseArray和ArrayMap。具体实现原理和特性
7、说一下kotlin的优缺点。let和with的区别
8、接口和抽象类的区别,接口中可以有属性么?
9、用过哪些设计模式?策略模式和桥接模式的区别
10、多线程如何实现?有哪些方式?
11、线程池的参数
12、你如何自己实现一个LRUCache?AndroID里面的LRUCache是如何实现的?
13、synchronized和volatile的区别?为何不用volatile替代synchronized?类锁和对象锁互斥么?
14、gcroot的类型
15、jvm的运行时数据结构。栈帧中会有什么异常?方法区里面存放的是什么数据?
16、动态代理的实现。
17、Gradle的实现,gradle中task的生命周期。
18、Aop、AspectJ、ASM了解么
19、组件化和模块化的区别。ARouter的缺点。
20、MVP、MVVM的优缺点,jetpack中的组件
21、okhttp源码。
22、glIDe缓存
23、你对Flutter的理解

二面

1、react的单向数据流
2、redux的状态管理,如何实现的?关键角色有哪些?
3、Flutter的channel通信有哪几种?你用的哪种?插件你如何实现的?
4、Flutter的包体积优化
5、自定义view的关键步骤,注意事项,你的理解
6、MeasureSpec讲一下
7、包体积优化
8、混淆的步骤和原理
9、module间的资源文件merge后,生成过多的R文件,处理过么?如何处理?
10、Bitmap内存大小,注意事项,如何优化
11、启动速度优化
12、glIDe中对Bitmap做了哪些 *** 作?三级缓存?为何在有了内存缓存后,还要持有ActivityRef这个呢?
13、gradle声明周期,task,插件
14、注解:Source和Class、Runtime注解的区别
15、卡顿优化
16、内存泄漏检测及优化
17、RecyclerVIEw的缓存,局部刷新用过么?
18、List的滑动卡顿如何优化
19、Activity中的Window的初始化和显示过程
20、Application中可以显示Dialog么?为什么?
21、泛型擦除,为何会有擦除?擦除的时机。通配符。
下面这段代码有问题么?有什么问题?为何会有这个问题?

List<? extends Object> List = new ArrayList<>();List.add(123);Object obj = List.get(0);

22、synchronized的同步原语
23、锁的几种状态
24、AndroID热修复原理,tinker的patch文件如何生成,patch文件是全部加载dex文件首部么?
25、插件化原理
26、两个用单链表表示的大数相加,求他们的和。单链表元素的值为0~9。

三面

1、选一个你的项目讲一下
2、技术选型是如何做的
3、优化内存
4、上传的重试机制
5、OOM和内存泄漏
6、包体积优化
7、你最擅长的点
8、你的职业规划

2、度娘

晚上八点半,在雨中打着伞接到电话,进行电话面试,一面就挂了。

Bitmap 使用时候注意什么?

Oom 是否可以try catch ?

内存泄露如何产生?

适配器模式,装饰者模式,外观模式的异同?

ANR 如何产生?

String buffer 与string builder 的区别?

如何保证线程安全?

java四中引用

Jni 用过么?

多进程场景遇见过么?

关于handler,在任何地方new handler 都是什么线程下

sqlite升级,增加字段的语句

bitmap recycler 相关

强引用置为null,会不会被回收?

glIDe 使用什么缓存?

GlIDe 内存缓存如何控制大小?

如何保证多线程读写文件的安全?

面试官声音略显慵懒疲惫……我怀疑他是不是面了太多人已经麻木了

3、京东物流一面

1、模块化,组件化,开发中要点有哪些。组件间如何去除强依赖。
2、AndroID11有没有适配
3、Flutter中State的生命周期,dIDUpdateWidget方法何时调用
4、包体积如何优化

二面

1、上家公司期间你的技术亮点,期间遇到什么问题,如何解决的,原理深挖。
2、VIEw的绘制流程。MeasureSpec,关键方法,
3、LRU如何实现的?linkedHashMap如何实现的?linkedHashMap是否线程安全?如何实现线程安全?有序还是无序?
4、ThreadLocal干嘛的?用法和原理。
5、HashMap讲一下,数据结构、hash过程、扩容、加载因子为何是0.75等。
6、Handler讲一下。Message#what的不同值,会影响Message在MessageQueue中的顺序么?
7、讲下Java的双亲委派
8、插件化和热更新原理
9、讲一下锁,synchronized和Lock。CAS原理
10、事件分发

三面

1、对vue的掌握程度
2、现有项目情况
3、包体积优化细节
4、画现有项目的架构图
5、后端交互过程中有遇到什么难以解决的问题么?如何解决的。
6、讲下你觉得最好或者最自豪的项目

四面

1、讲下hashmap;链表转红黑树的限制为何是8;红黑树的时间复杂度;红黑树转链表的限制为何是6;current hashmap在所有情况下都是线程安全的吗?hashtable呢?
2、synchronized实现。非静态方法A和B在同一个类中,方法A用synchronized修饰,当A方法因为多线程请求有线程阻塞在对象锁上的时候,B方法的访问受不受影响?
3、既然泛型有编译期类型擦除,那么运行时无法获取到具体类型;而反射能在运行时获取到Class的类型;它们一个获取不到,一个可以获取到,这不就是矛盾么?请解释下细节。
4、在同一个手机上,如果把drawable-xxhdpi下的图片移动到drawable-xhdpi下,图片内存是如何变的,解释原理。如果在drawable-hdpi、drawable-xxhdpi下放置了图片,但是手机是xhdpi的,会优先加载哪个,加载优先级是怎样的?如果是400800,10801920这种呢,会如何查找?xhdpi和400*800同时存在时,会如何查找?布局文件呢?
5、图片内存优化;
6、Handler机制。MessageQueue中的Message是如何排列的?Msg的runnable对象可以外部设置么,比如说不用Handler#post系列方法(反射可以实现);
7、application中持有静态的用户信息,有何缺点?如何改进?
8、mvp和mvvm,jetpack

4、字节跳动一面

1.插件化。启动activity的hook方式。taskAffity。
2.okhttp支持http2?http2的功能有哪些?tcp方面拥塞控制?tsl的握手和具体的非对称加密算法。非对称名称
3.handler的post(Runnable)如何实现的。callback,runnable,msg的执行优先级。
4.阻塞是怎么实现的?为什么不会阻塞主线程?
5.求二叉树中两个节点之间的最大距离。
6.206含义,未修改资源是哪个,302含义,301含义
7.多进程通信问题。binder优势。aIDl生成的java类细节。多进程遇到哪些问题?
8.动态代理传入的参数都有哪些?非接口的类能实现动态代理吗?ASM的原理
9.Application和Activity在Context的继承树上有何区别?二者使用上有何不同?
10.任意一颗二叉树,求最大节点距离

二面

1.设计一个日志系统。
2.内存泄露的分类。怎么查看内存泄露的问题
3.touch事件源码问题。
4.组件化的问题。module和app之间的区别。moduler通信是如何实现的。
5.native奔溃的日志采集,怎么处理?
6.注解实现一个提示功能:如果int的值大于了3需要提示。

三面

1.介绍下Flutter的启动流程
2.介绍下Flutter与weex的区别
3.组件化介绍一下
4.webvIEw中与Js通信的手段有哪些?
5.介绍下Flutter_boost的原理

四面

1.适配器和装饰模式各自特点和使用场景
2.视频编解码是怎么做的
3.三色球排序

5、小米一面

1、组件化
2、mvp优缺点,mvvm
3、kotlin
4、单例的几种实现方式:DCL、enum,静态内部类。还有饿汉式。懒汉式的使用场景:占用内存大、延迟初始化
5、jvm:运行时数据分区;类加载过程;GCRoot,垃圾回收算法。
6、hashmap。hash冲突时给链表插入数据,1.7头插法,1.8尾插法。
7、ArrayMap和SparseArray的区别,实现。
8、泛型:为何会有协变和逆变,pecs规则。
9、kotlin泛型:out和in.
10、Handler。Looper.loop( )为何不会阻塞进程。
11、自定义view的几种方式。onMeasure、onLayout、onDraw方法都何时需要重写。自定义属性的作用。
12、事件分发,多点触碰处理,是在ontouchEvent方法里面。
13、网络优化,网络监控。
14、网络分层架构,https的连接过程,tcp和udp的区别。
15、blog相关。
16、滑动窗口的最大值。

二面

1、滑动冲突如何解决?有几种方式?具体从哪个事件开始拦截?在哪里拦截?比如双层VIEwPager嵌套的滑动冲突如何解决。

2、事件分发的具体流程。

3、Activity#setContentVIEw中的xml文件是如何转化成VIEw并显示到Activity中的。
①PhoneWindow是在哪里初始化的?
②LayoutInflater是如何把xml布局文件转换成VIEw对象的(反射)?VIEw树如何生成的?怎么优化?
③为什么会有R文件这个映射表?直接使用资源的路径不好么?
④AndroID项目中都包含哪些资源?apk打包流程。apk解压后都包含哪些资源?R文件打包后生成的文件是哪种?
⑤dex文件结构了解过么?为何会有65535的限制?mutildex技术了解么?这项技术的目的是什么?
⑥Window和Activity的对应关系。除了Activity还有别的方式显示Window出来么?

4、绘制相关:
①requestLayout调用后,都会调用哪些方法?
②onMeasure、onLayout、onDraw这三个方法中,哪个最耗时?onMeasure和onLayout呢?
③Choreography的作用。它的上游和下游各自是哪个。Choreography发布了订阅消息,同类型的Callback还有哪些?这些Callback之间的优先级如何?vsync机制。
④Surface对象了解么?作用,何时初始化,怎么使用的。
⑤一个button的点击事件中,调用requestLayout,接下来哪些方法会被调用?
⑥Surface和Window的关系
⑦SurfaceVIEw的实现
⑧VIEw#draw()方法细节
⑨绘制的数据是如何提交到远端的SurfaceFlinger
⑩GPU和surfaceFlinger之间的设计思想是什么?surfaceFlinger具体作用是什么?它对数据做了哪些 *** 作?
⑪硬件加速了解么?GPU如何高效绘制?

5、ContentProvIDer具体实现。

6、binderService方法中的回调具体运行在哪个线程?binder线程池最大线程数是多少?自定义的Callback远程调用,运行在哪个线程?为何不是主线程,如果运行在主线程会有哪些问题?

7、hdpi和xxhdpi的手机,分别加载xhdpi下的图片,会缩放图片么?如果会缩放,是如何缩放的,像素点是如何补全或者减少的?图片在内存中的大小会如何变化?

8、 *** 作系统:
①讲一下用户态和内核态
②为何会有用户态和内核态划分

9、数据结构:
①二叉树用的多么?哪里用过?
②二叉搜索树、AVL树,红黑树
③二叉树的使用举例。
④链表和二叉树的区别,优劣势

10、jetpack组件库使用过么?讲下具体组件

11、函数式编程如何理解?

12、t1、t2、t3三个线程,如何让三个线程按照顺序依次打印1-100。手写。

三面

1、悬浮窗如何实现
2、通知的类别
3、为何需要进程保活?如何做?
4、进程优先级
5、AndroID为何会使用binder来进行进程间通信。
6、oneway和非oneway了解么?举例说明
7、binder线程池的最大线程个数;binder线程池中如果满了,对待新来的任务,会如何处理?此时clIEnt端会是什么效果?
8、ANR的log中关键字是什么?
9、你认为优秀的工作流程是怎样的?
10、讲下你项目的技术栈。
11、你认为好的app质量标准,产品标准。

在复习的三四个月时间里,把大厂的面试题做了一个整理,有需要的朋友可以去我的【GitHub】自取,免费分享给大家,算是一个感恩回馈吧。

最后

大厂面试问深度,小厂面试问广度,如果有同学想进大厂深造一定要有一个方向精通的惊艳到面试官,还要平时遇到问题后思考一下问题的本质,找方法解决是一个方面,看到问题本质是另一个方面。还有大家一定要有目标,我在很久之前就想着以后一定要去大厂,然后默默努力,每天看一些大佬们的文章,总是觉得只有再学深入一点才有机会,所以才有恒心一直学下去。

总结

以上是内存溢出为你收集整理的Android茫茫半年求职路,终于斩获三个大厂offer全部内容,希望文章能够帮你解决Android茫茫半年求职路,终于斩获三个大厂offer所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1055892.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存