美文网首页Android进阶之路
做了三年Android开发,从被小公司婉拒到收割百度offer,

做了三年Android开发,从被小公司婉拒到收割百度offer,

作者: Kepler_II | 来源:发表于2020-12-17 16:24 被阅读0次

前言

从毕业到现在面试也就那么几家公司,单前几次都比较顺利,在面到第三家时都给到了我offer!前面两次找工作,没考虑到以后需要什么,自己的对未来的规划是什么,只要有份工作,工资符合自己的要求就行!所以在智联招聘上选好工资范围,就一顿海投,做等面试电话!

做了两年快三年的Android开发,工作的任务也就是一些界面的编写,RecyclerView的简单使用,网络框架也是别人封装好的直接用,再就是集成些第三方的分享、支付什么的!技术上的提升可以说根本没有,和工作一年左右的人,比起来就多几个项目优势!所以这次出来找工作还期望15K,说起来心里很慌!有哪些原因呢?

1、小公司要求不高,自己也抱着只要能做出功能的态度

2、对行业趋势把握不准,没有未来规划(所谓混吃等死)

3、对自己的工作不感兴趣,上班有空闲时间也不会去深入学习

再来说说这次找工作面试的一些经历和感想!这次面试大大小小面试了十多家!依我自己在简历上写的几个商城类APP的工作经验,在智联和拉钩上也只有小公司能叫我去面试!(所以说技术深度很重要)

前面两次的由于面试没怎么准备,直接over肯定是没问题的!第一家一个小姐姐把我问得n脸懵逼(一个屌丝程序猴和妹子聊天就紧张,心跳加速,口干舌燥,说话结巴)!她首先让我自我介绍一下,可脑袋一下像短路了一样!就说:“你知道的程序员表达能力差,嗯。。。嗯。。。你看简历吧!”她直接一脸无语!

新一轮面试的准备

正是因为上一次面试的悲惨经历,因为感觉自己突然啥都不会了,迅速镇定下来,去网上找了一下Android的面试题,但是发现都只有提问了什么并没有对所提问题的解答,那只能自力更生,像做试卷一样,一遍总结一遍温顾。

其实大多都是平时开发中用到的,只是我们没有总结过,被问起来的时候回答的难免会有点捉襟见肘,不能回答的很全面.下面为我个人总(bai)结(du)的,希望对你能有所帮助,但毕竟能力有限,有写的不对的地方,还望轻喷.虽然喷我我也不会改的.

因为本文篇幅较长建议收藏,在用到时候找出来看一眼.有一些知识点可能没涉及到,以后会加以补足.因为面试无非是考察你对技术的理解和总结,所以本篇的每个点总结的比较精简,只是让你大概的说出来,有的部分是需要能够画出原理图并进行解释说明,这个要在工作中多积累.

常考知识点

1、Java

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

①HashMap添加元素的过程,hash方法细节;扩容的触发条件、扩容过程中是数据是整体复制么?链表转红黑树的阈值为何是8,红黑树转链表的阈值为何是6,为何不上同一个阈值?链表为何要转红黑树?红黑树有何特性?hashmap为何如此设计?

②对应的并发容器。HashTable以及ConcurrentHashMap实现细节,优劣势; 如何使现有的HashMap线程安全?(Collections#synchronizedMap)

  • 运行时数据区域分区,哪些线程私有,哪些线程共享。栈帧的数据结构。方法区存放哪些数据。
  • 简单描述一下 Person person = new Person() 对象实例化过程。最好有类加载过程。
  • GCRoot的类型,举例说明。
Activity中的匿名Handler导致的内存泄漏,最终的引用链root要分析到Thread#threadLocals上

  • LRU的实现。让你自己实现一个,你会怎么做。
  • 线程的几种状态。
  • 线程池。
①7个参数。
②线程池中的任务可以实现按照优先级执行么,如何实现?(优先级队列)
③线程池的设计用到了那种设计思想?(生产者消费者模型)
④何为阻塞队列?
⑤你是如何配置线程池的?核心线程数你一般是怎么配置的?

  • T1、T2、T3三个线程,如何保证它们顺序执行?也就是异步转同步的方式。
①Thread#join
②等待多线程完成的CountDownLatch
③FutureTask
④Executors#newSingleThreadExecutor
⑤wait/notify

  • Java中 wait和sleep方法的不同?(wait释放锁,sleep不会释放锁)
  • 线程安全相关。
  • 锁。synchronized、volatile、Lock。锁的几种状态。CAS原理。
①为什么会有线程安全?
②Java中如何保证线程安全?
③synchronized和Lock的使用、区别及底层实现;volatile的作用和使用方式;常见的原子类。
④synchronized中的类锁和对象锁互斥么?

  • 讲下Java的双亲委派。
  • 泛型。
①泛型擦除的原因和效果,擦除的时机。
②为何会有协变和逆变
③通配符。
④PECS

  • 反射。
  • 注解。
①Source和Class、Runtime注解的区别
②注解如何使用

  • 方法内部的匿名内部类使用方法的局部变量时,为何要使用final修饰?

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的生命周期。
  • 插件化原理。
  • 热修复原理。

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、项目相关

  • 选一个你最熟悉的项目讲解下。
  • 讲一下你的技术栈
  • 你最自豪的项目或者片段
  • 你最擅长哪些部分
  • 你的上份工作经历中,最大的收获是什么?
  • 你的职业规划

百度面试经历分享 (已拿offer)

大多数题目都可以在上面找到答案.

电话面试题

1.ArrayList 和 Hashmap 简单说一些,区别,底层的数据结构.

2.Handler 消息机制

3.引起内存泄漏的场景

4.多线程的使用场景?

5.常用的线程池有哪几种?

6.在公司做了什么?团队规模?为什么离职?

第一轮

1.知道哪些单例模式,写一个线程安全的单例,并分析为什么是线程安全的?

2.Java中的集合有哪些?解释一下HashMap?底部的数据结构?散列表冲突的处理方法,散列表是一个什么样的数据结构?HashMap是采用什么方法处理冲突的?

3.解释一下什么是MVP架构,画出图解,一句话解释MVP和MVC的区别?

4.Handle消息机制?在使用Handler的时候要注意哪些东西,是否会引起内存泄漏?画一下Handler机制的图解?

5.是否做过性能优化?已经采取了哪些措施进行优化?

6.引起内存泄漏的原因是什么?以及你是怎么解决的?

这些问题应该都是比较基础的问题,每个开发者都应该是非常熟悉并能详细叙述的.这一轮的面试官问的技术都是平时用到的.

第二轮

1.关于并发理解多少?说几个并发的集合?

2.Handler 消息机制图解?

3.在项目中做了哪些东西?

4.画图说明View 事件传递机制?并举一个例子阐述

5.类加载机制,如何换肤,换肤插件中存在的问题?hotfix是否用过,原理是否了解?

6.说说项目中用到了哪些设计模式,说了一下策略模式和观察者模式?

7.会JS么?有Hybid开发经验么?

8.说一下快排的思想?手写代码

9.堆有哪些数据结构?

对于这轮面那是明显感觉到压力,知识的纵向了解也比较深,应该是个leader.

第三轮

1.介绍一下在项目中的角色?

2.遇到困难是怎么解决的?

3.如何与人相处,与别人意见相左的时候是怎么解决的,并举生活中的一个例子.

4.有没有压力特别大的时候?

这个应该是项目经理了,问的问题偏向于生活性格方面.

以上面试中问到的题目基本上都可以在我的GitHub里找到答案,所以做准备是很重要的,但技术是一点点积累的,就算你全会背了,面试过了,真正等到工作的时候还是会捉襟见肘的,所以踏实点吧骚年.

我的【Github】会分享一些关于Android进阶方面的知识,也会分享一下最新的面试题~

如果你熟练掌握【Github】中列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包——————可以我的【Github】阅读下载,最后觉得有帮助、有需要的朋友可以点个赞

相关文章

网友评论

    本文标题:做了三年Android开发,从被小公司婉拒到收割百度offer,

    本文链接:https://www.haomeiwen.com/subject/hpxzgktx.html