阅读 1240

卧槽,大佬把大厂真题给我了!(别点关注,别点赞,看文章,求你们了!)

面试题汇总

前言

面试真题,由Android研习社社员提供,这一次放出来是为了帮助大家更好的准备面试;部分题目写了一些答案,仅供参考,大家关注问题本身就好

技术题目

Java相关

  • JNI 分配的对象是在栈上还是堆上?JNI 怎么调用 Java,Java 怎么调用 JNI,数据如何传递?JNI 与 JNA 有什么区别?
  • HashMap 你能了解吗?你能说说它的数据结构是什么样的吗?
  • 动态代理是如何实现的?有没有看过相关源码?
  • 范型的协变了解吗?
设计模式
  • 讲讲你项目中用的设计模式?
  • 设计模式你最熟的是哪个?
大家平时接触最多的设计模式肯定就是单例了。有时候面试官会提问,除了单例模式,你最熟悉的设计模式是什么?

我还是先来说一下单例吧

现在一般我们都会写静态单例,或者双重校验锁,静态单例原理好像是利用的jvm中静态实例只会加载一次的特性,所以之后再去获取的时候肯定是唯一的;

然后说一下双重校验锁。为什么要双重校验呢?如果只校验一次可不可以呢?其实是可以的,多线程去获取锁对象的时候遇到synchronize加锁的代码块,肯定需要先获取锁才能进行下一步操作。但是这里就有一个问题,就是效率不高,每次都需要去查看锁对象是否被抢占。于是才有了双重校验锁,先在synchronize代码块外进行一次非空判断(没有加锁,减少了获取锁的时间),如果不为空就直接返回了;如果为空,再进行进一步的同步获取锁的操作。

那双重校验锁有缺点吗?其实是有的,就是jvm可能会对执行进行重排,导致创建对象时,可能变量和内存都申请完成,但是把实例数据放置到内存空间这一步没有完成,导致对象为空的情况。

这个问题的根本原因,其实是指令重排导致的有序性问题。

解决可见性问题,java提供了volatile关键字,就能够针对该对象禁用指令重排。



然后再来按照面试官的要求,说一下适配器模式。适配器模式在Android中应用的很广泛了,一般是用来做数据和UI的接口适配器。

在Android之外,其实大家都不是很看好适配器模式。因为它是固有设计不合理才产生的,把一个接口,转化为另一个接口。这也是适配器模式的概念,把两个不兼容的接口,通过统一的接口适配为一个可以调用的接口方式。

但是在Android中这个模式反而如鱼得水,因为总有需求要把数据呈现到UI上来,适配器模式其实是实现了相同数据格式的呈现接口的复用,减少了冗余代码,也把数据和UI做了解藕。

除了适配器模式,我在项目的实际使用中还使用过构造者模式和观察者模式。
构造者模式一般用来和工厂模式做对比,他们都是构建型设置模式,构造者模式是针对的复杂对象,比如说一个类初始化需要穿10几个参数,那对于使用者来说,第一不易读,第二写着也不方便,传10多个参数简直就是噩梦。
构造者模式其实是把各个参数独立出来,提供单独的方法来设置,然后返回本类对象,实现可以链式调用。


复制代码
网络
  • http和https的区别
  • HTTPS 的工作原理和链接建立过程,非对称加密用来加密什么数据?对称加密用来加密什么数据?
多线程
  • 说一下多线程的同步方式
  • 说一下线程池
  • 多线程执行中,如何实现每个线程有序输出ABC ABC?
  • 单例的创建模式介绍一下?双重检查锁有没有缺陷?
  • 你是会对方法加锁?还是对语句块加锁呢?
  • 写 DoubleCheck 的单例,并讲讲两次 check 的意义是什么?是否可以去掉?如果去掉了某一个(或全部)会不会出问题?
  • 如何保证代码运行的原子性?加锁的方式有哪些?
首先说下什么是原子性。原子性,从表面上看是不能分割,本质上不可中断,也就是说操作有一致性的要求。
比如说付款这个操作,一定是涉及到转出和转入操作的一直性,也就是原子性。

在java中,多个线程间要保证一致性其实就是要对其进行加锁。这个说的是业务层面的原子性。

加锁的方式,可以直接在方法上家sync关键字,jvm会自动在方法开始的地方加上look,在方法结束的地方加上unlook,保证它们是成对使用的。这种方法的锁对象是该类的实例对象。

还可以对代码块进行加锁,减少临界区的范围,提高性能。如果是sync(this),锁对象也是该类的实例对象,
如果是sync(非this对象),那是用的锁就是这个对象。

另外除了直接使用sync关键字,还可以直接使用look和unlook进行加锁和解锁,但是不要忘了他们需要成对使用

复制代码
  • CountDownlatch 的使用场景是什么?
先说一下实际的应用场景吧,比如在做app启动优化的时候,如果多个异步任务有依赖关系,

比如taskA必须在taskB和taskC,taskD,都异步执行完之后再执行,那就可以用countDownlatch在主线程使用await阻塞等待,

设置countDownlatch(3),每完成一个任务就执行一次countdown,

当三个现在都执行完成后,await阻塞等待结束,就可以执行taskA了

现在来总结下,该类主要是用来处理多个线程异步执行时作为条件变量来进行阻塞判断的情景。

复制代码
JVM
  • 说一下java的垃圾回收机制
  • JVM 的内存区域划分是什么样的?你能说说为什么这样划分吗?
  • 说一下类的整个加载过程
  • 讲讲当我要创建对象时都会发什么?

Android相关

Handler快问快答

  • 说一下handler机制?
  • 子线程如何使用 Handler?
  • 说一下你对Handler中ThreadLocal的理解?
  • handler的postDelay是一种什么样的状态?
  • 如何对sendMsg进行拦截?
  • 说一下你对IdleHandler的了解
  • 对当前页面进行截图?
  • 列表三层展开如何实现?
  • 能否在子线程刷新 UI?
  • ANR 如何排查?
  • invalidate 和 requestLayout 的区别?
  • 滑动冲突如何解决?
  • 在 Activity 的生命周期中可以拿到 View 的明确宽高?
  • 主线程的 Looper 什么时候创建的?ActivityThread 的 main 什么时候调用?
  • OkHttp 源码读过吗?连接复用了解过吗?
  • 讲讲你了解的 Adnroid 进程间通信?Binder 是如何工作的?项目中有使用到进行通信吗?
  • 如何实现完成上传九张图片后的进行数据处理的一个操作?
  • 自定义 ViewGroup 需要重写哪些方法?
  • 你说你熟悉属性动画,那来讲讲?
  • 来讲讲触摸反馈流程?如何中断某个事件或者说不想让他往下传,能不能更早?
  • 事件的冲突你有处理过吗?
  • 有做过性能优化吗?哪些方面?怎么做的?
  • App 的内存优化应该怎么做?
  • 非静态内部类会引起内存泄漏吗?怎么解决?如果我一定要使用非静态内部类那应该怎么处理?
  • 一个线程中能有几个 Handler?如何保证唯一?
  • 主线程的 Looper 与子线程的 Looper 有什么区别?
  • 讲一下 App启动流程?
  • 美团饿了么列表中下拉刷新的快递员跑步会骑车动画如何实现?
  • Recycler 如何添加 Header?
  • OkHttp 底层是怎么工作的?现在让你设计 Http 库你会怎么设计?
  • 线程池开几个线程比较好呢?
  • 线程切换怎么做?Handler 是怎么实现线程切换的呢?
  • 二倍图和三倍图是什么概念?图片应该放在哪个目录下更合适?
  • 多渠道打包你用过吗?
  • build 配置文件中,你都写过什么?
  • ART虚拟机对垃圾回收有什么优化吗?
  • 说一下ART安装时的优化
  • OkHttp的请求URL中如果有中文字符会出现乱码吗?
  • OkHttp是如何发起一个Http请求的?
  • Okhttp的缓存是如何实现的?
  • Android9.0中如何使用http?
  • LruCache是怎么实现的?
  • 说一下View,activity,window三者之间的关系
  • Android 7.0 之后需要做哪些适配工作?
  • 自定义view的重叠绘制如何优化?
  • 读过AsyncTask源码吗?他是同步还是异步?
  • Material design 相关的控件了解吗?
  • 如何用自定义view实现Android的导航栏?中间的圆按钮需要超出父布局的限制,这个怎么实现?或者怎么处理?
  • 请说一下你对Retrofit的原理的理解?
  • 说一下你对MVVM的理解?有什么优缺点?
  • 针对 Target 28 的适配遇到过什么问题?
  • 三方Sdk如果不使用Https,应该怎么适配?
  • 说下对ConstraintLayout的了解,即对MotionLayout的了解?
  • Dagger2中的作用域是怎么实现的?
  • 项目中Dagger的Component是怎样的关系?
  • Dagger2是如何动态生成对象的?有没有什么问题?
  • EventBus有什么缺点?
  • 两个进程分别持有一个HttpClient,在进程1中发送100个Https请求,每次请求都会发生一次ssl的过程吗?在进程2中又发了一次Https请求,Host相同,会不会复用进程1的请求?
  • 说一下Apk的安装过程?
  • 平时我们使用启动界面的时候都是通过Intent传递数据的,如果想通过依赖注入的方式,应该怎么设计?
  • NestedScroll是如何实现的?如何自定义一个嵌套滑动控件?
  • 讲一下View的事件分发机制?
  • 说一下LayoutParams的原理?
  • 说一下对RecylerView缓存机制的理解?

其他

  • audioRecod 与 MediaRecoder 的区别?
  • 你 AudioRecoder 如何使用的?比如在特定场景下你如何使用的?
  • 了解过音频的压缩格式吗?mp3 的的压缩格式是怎么样的?
  • 说下Https 的工作原理?
  • 你 SDK 的项目架构是什么样的?怎么设计的?
  • Flutter 了解过么?Flutter 如何与 Native 层交互?
  • Kotlin 会吗?记得 Kotlin 有哪些特性?你对 Kotlin 了解到什么程度,Kotlin 有什么好处?有没有用过Kotlin Anko?
  • Kotlin 的inline 方法和 inline 参数有了解吗?
  • c / c++ 会吗?
  • 你有看过什么源码?讲讲 OkHttp 源码?
  • 接触过组件化吗?你对组件化的理解是什么样的?
  • 你做过的所有东西中你觉得最复杂的是什么?
  • so 库有兼容和加载是如何完成的?我很多很多架构的 so 最终会使用哪个?
  • 推送的流程是怎么样的?假如现在让你设计一个推送的模块你会怎么设计?如何提升推送送达率?
  • 锁在操作系统级是如何实现的呢?
  • 如何不通过临时变量交换两个变量?
  • 介绍下你在Android技术上的优势?
  • 学习过哪些第三方库?
  • 最新的技术栈用过哪些?
  • 热修复的使用场景是什么?对热修复框架的原理和区别有没有了解?
  • 埋点,Hook事件有了解吗?
  • 介绍下项目的架构?
  • Keep-Alive是什么原理?讲一下工作流程?
  • Tcp,Udp的长连接是怎么做的?如何保证长连接的安全,保证没有被窃听及服务器的合法性?消息的解析和发送怎么设计?长连接的重试怎么做?
  • 说下对Clean 架构 ,及MVP的理解?

非技术题目

  • 你还有什么要问我的吗?
  • 有过主导 App 开发的经历吗?
  • 介绍下你负责做的这部分内容的完整流程是什么?
  • 你为什么离职?
  • 平时喜欢通过什么样的途径去学习?你最近学的一个技术点是什么?
  • 你平时是如何定位问题的?
  • 你在公司中负责的是哪一块的工作?
  • 找工作倾向于哪些方面?

特别感谢:Android研习社社长--南山丶Gzw

郑重声明

本文由Android研习社社群创作,版权©️归Android研习社所有,侵权必究!