美文网首页Android开发经验谈Android开发程序员
2020最新安卓必问面试题及参考答案

2020最新安卓必问面试题及参考答案

作者: python草莓 | 来源:发表于2020-05-08 15:45 被阅读0次

现创建了一个Android开发水友圈,圈内会不定时更新一些Android中高级的进阶资料,欢迎大家带着技术问题来讨论,共同成长进步!(包含资深UI工程师,Android底层开发工程师,Android架构师,原生性能优化及混合优化,flutter专精);希望有技术的大佬加入,水圈内解决的问题越多获得的权利越大!

1、网络

网络协议模型

应用层:负责处理特定的应用程序细节 HTTP、FTP、DNS

传输层:为两台主机提供端到端的基础通信 TCP、UDP

网络层:控制分组传输、路由选择等 IP

链路层:操作系统设备驱动程序、网卡相关接口

TCP 和 UDP 区别

TCP 连接;可靠;有序;面向字节流;速度慢;较重量;全双工;适用于文件传 输、浏览器等

  • 全双工:A 给 B 发消息的同时,B 也能给 A 发
  • 半双工:A 给 B 发消息的同时,B 不能给 A 发
    UDP 无连接;不可靠;无序;面向报文;速度快;轻量;适用于即时通讯、视 频通话等

TCP 三次握手

A:你能听到吗?

B:我能听到,你能听到吗?

A:我能听到,开始吧

A 和 B 两方都要能确保:我说的话,你能听到;你说的话,我能听到。所以需 要三次握手

TCP 四次挥手

A:我说完了

B:我知道了,等一下,我可能还没说完

B:我也说完了

A:我知道了,结束吧

B 收到 A 结束的消息后 B 可能还没说完,没法立即回复结束标示,只能等说 完后再告诉 A :我说完了。

POST 和 GET 区别

Get 参数放在 url 中;Post 参数放在 requestBody 中 Get 可能不安全,因为参数放在 url 中

HTTPS

HTTP 是超文本传输协议,明文传输;HTTPS 使用 SSL 协议对 HTTP 传输数据 进行了加密

HTTP 默认 80 端口;HTTPS 默认 443 端口

优点:安全

缺点:费时、SSL 证书收费,加密能力还是有限的,但是比 HTTP 强多了

2、Java 基础&容器&同步&设计模式

StringBuilder、StringBuffer、+、String.concat 链接字符串:

  • StringBuffer 线程安全,StringBuilder 线程不安全

  • +实际上是用 StringBuilder 来实现的,所以非循环体可以直接用 +,循环体不行, 因为会频繁创建 StringBuilder

  • String.concat 实质是 newString ,效率也低,耗时排序:StringBuilder<StringBuffer <concat<+
    Java 泛型擦除

  • 修饰成员变量等类结构相关的泛型不会被擦除

  • 容器类泛型会被擦除
    ArrayList、LinkedList

ArrayList

基于数组实现,查找快:o(1),增删慢:o(n)

初始容量为 10,扩容通过 System.arrayCopy 方法

LinkedList

基于双向链表实现,查找慢:o(n),增删快:o(1) 封装了队列和栈的调用

HashMap 、HashTable

HashMap

  • 基于数组和链表实现,数组是 HashMap 的主体;链表是为解决哈希冲突而存在的
  • 当发生哈希冲突且链表 size 大于阈值时会扩容,JAVA8 会将链表转为红黑树提高 性能 允许 key/value 为 null
    HashTable
  • 数据结构和 HashMap 一样
  • 不允许 value 为 null
  • 线程安全
    ArrayMap、SparseArray

ArrayMap

1.基于两个数组实现,一个存放 hash;一个存放键值对。扩容的时候只需要数 组拷贝,不需要重建哈希表

2.内存利用率高

3.不适合存大量数据,因为会对 key 进行二分法查找(1000 以下)

SparseArray

1.基于两个数组实现,int 做 key

2.内存利用率高

3.不适合存大量数据,因为会对 key 进行二分法查找(1000 以下)

volatile 关键字

  • 只能用来修饰变量,适用修饰可能被多线程同时访问的变量
  • 相当于轻量级的 synchronized, volatitle 能保证有序性(禁用指令重排序)、可见性; 后者还能保证原子性
  • 变量位于主内存中,每个线程还有自己的工作内存,变量在自己线程的工作内存中 有份拷贝,线程直接操作的是这个拷贝
  • 被 volatile 修饰的变量改变后会立即同步到主内存,保持变量的可见性。
    双重检查单例,为什么要加 volatile?

1.volatile 想要解决的问题是,在另一个线程中想要使用 instance,发现 instance!=null,但是实际上 instance 还未初始化完毕这个问题

2.将 instance=newInstance();拆分为 3 句话是。1.分配内存 2.初始化 3.将 instance 指向分配的内存空

3.volatile 可以禁止指令重排序,确保先执行 2,后执行 3,wait 和 sleep

  • sleep 是 Thread 的静态方法,可以在任何地方调用
  • wait 是 Object 的成员方法,只能在 synchronized 代码块中调用,否则会报 IllegalMonitorStateException 非法监控状态异常
  • sleep 不会释放共享资源锁,wait 会释放共享资源锁

lock 和 synchronized

  • synchronized 是 Java 关键字,内置特性;Lock 是一个接口
  • synchronized 会自动释放锁; lock 需要手动释放,所以需要写到 trycatch 块中并在 finally 中释放锁
  • synchronized 无法中断等待锁;lock 可以中断
  • Lock 可以提高多个线程进行读/写操作的效率
  • 竞争资源激烈时,lock 的性能会明显的优于 synchronized

可重入锁

  • 定义:已经获取到锁后,再次调用同步代码块/尝试获取锁时不必重新去申请锁,可 以直接执行相关代码
  • ReentrantLock 和 synchronized 都是可重入锁

公平锁

  • 定义:等待时间最久的线程会优先获得锁
  • 非公平锁无法保证哪个线程获取到锁,synchronized 就是非公平锁
  • ReentrantLock 默认时非公平锁,可以设置为公平锁

乐观锁和悲观锁

  • 悲观锁:线程一旦得到锁,其他线程就挂起等待,适用于写入操作频繁的场景; synchronized 就是悲观锁
  • 乐观锁:假设没有冲突,不加锁,更新数据时判断该数据是否过期,过期的话则不 进行数据更新,适用于读取操作频繁的场景
  • 乐观锁 CAS:CompareAndSwap,更新数据时先比较原值是否相等,不相等则表示 数据过去,不进行数据更新
  • 乐观锁实现:AtomicInteger、AtomicLong、AtomicBoolean

死锁 4 个必要条件

  • 互斥
  • 占有且等待
  • 不可抢占
  • 循环等待

synchronized 原理

  • 每个对象都有一个监视器锁:monitor,同步代码块会执行 monitorenter 开始, motnitorexit 结束

  • wait/notify 就 依 赖 monitor 监 视 器 , 所 以 在 非 同 步 代 码 块 中 执 行 会 报 IllegalMonitorStateException 异常

    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    Serializable、Parcelable
    image.png
    image.png
    image.png
    OOM 场景及规避
  • 加载大图:减小图片

  • 内存泄漏:规避内存泄漏

5、Android 模块化&热修复&热更新&打包&混淆&压缩

Dalvik 和 ART

  • Dalvik
    o 谷歌设计专用于 Android 平台的 Java 虚拟机,可直接运行 .dex 文件,适 合内存和处理速度有限的系统 o JVM 指令集是基于栈的;Dalvik 指令集是基于寄存器的,代码执行效率更 优
  • ART
    o Dalvik 每次运行都要将字节码转换成机器码; ART 在应用安装时就会转换成 机器码,执行速度更快 o ART 存储机器码占用空间更大,空间换时间
    APK 打包流程
    1.aapt 打包资源文件生成 R.java 文件;aidl 生成 java 文件
    2.将 java 文件编译为 class 文件
    3.将工程及第三方的 class 文件转换成 dex 文件
    4.将 dex 文件、so、编译过的资源、原始资源等打包成 apk 文件
    5.签名
    6.资源文件对齐,减少运行时内存
    App 安装过程
  • 首先要解压 APK,资源、so 等放到应用目录
  • Dalvik 会将 dex 处理成 ODEX ;ART 会将 dex 处理成 OAT;
  • OAT 包含 dex 和安装时编译的机器码
    组件化路由实现
    ARoute:通过 APT 解析 @Route 等注解,结合 JavaPoet 生成路由表,即路由 与 Activity 的映射关系

6、音视频&FFmpeg&播放器

FFmpeg
基于命令方式实现了一个音视频编辑 App: https://github.com/yhaolpz/FFmpegCmd
集成编译了 AAC、MP3、H264 编码器
播放器原理
视频播放原理:(mp4、flv)-> 解封装 -> (mp3/aac、h264/h265)-> 解码 -> (pcm、yuv)-> 音视频同步 -> 渲染播放
音视频同步:

  • 选择参考时钟源:音频时间戳、视频时间戳和外部时间三者选择一个作为参考时钟 源(一般选择音频,因为人对音频更敏感,ijk 默认也是音频)
  • 通过等待或丢帧将视频流与参考时钟源对齐,实现同步
    IjkPlayer 原理
    集成了 MediaPlayer、ExoPlayer 和 IjkPlayer 三种实现,其中 IjkPlayer 基于 FFmpeg 的 ffplay
    音频输出方式:AudioTrack、OpenSLES;视频输出方式:NativeWindow、OpenGL ES

需要更多视频及文档资料的私信我,更多进阶及面试资料的请进圈领取,欢迎大家理性讨论,有疑问的欢迎留言讨论。

相关文章

网友评论

    本文标题:2020最新安卓必问面试题及参考答案

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