2017年下半年面试问题以及解析精华整理(上)

阅读 4129
收藏 404
2018-03-12
原文链接:ailoli.me
  • LRUCache原理
    • LruCache中维护了一个集合LinkedHashMap,该LinkedHashMap是以访问顺序(accessOrder为true,其余非构造函数此值全为false)排序的。当调用put()方法时,就会在集合中添加元素,并调用trimToSize()判断缓存是否已满,如果满了就用LinkedHashMap的迭代器删除队尾元素,即近期最少访问的元素。当调用get()方法访问缓存对象时,就会调用LinkedHashMap的get()方法获得对应集合元素,同时会更新该元素到队头。
    • LinkedHashMap内部是使用双向循环链表来存储数据的。也就是每一个元素都持有他上一个元素的地址和下一个元素的地址。
  • 图片加载原理(Glide)
    • 这篇文章对几大开源图片加载库做了对比Android 三大图片缓存原理、特性对比
    • 个人使用过ImageLoader和Glide,相对而言对Glide较为熟悉。对Glide这个点可以稍作分析,如何感知activity或者Fragment生命周期的: - 往Activity或者Fragment内部添加一个SupportRequestManagerFragment透明的Fragment,用回调的方式感知生命周期。
  • 模块化的好处
  • JVM
  • 视频加密传输
    • 加密:
      • DES对整个视频文件进行加密,但耗时较长。
      • 将视频数据流前n个字节(n>=2)打乱即可达到加密目的,使用到了内存映射文件(对RandomAccessFile和MappedByteBuffer的使用)。参考这篇文章
    • 数据加密传输:
      • android上数据加密传输比较麻烦,得不偿失。综合阅读过的几篇文章,觉得还是先加密再传输来得好。
  • 统计启动时长,标准
    • 参考文章
    • app冷启动的流程如下:
      -> Application 构造函数
      -> Application.attachBaseContext()
      -> Application.onCreate()
      -> Activity 构造函数
      -> Activity.setTheme()
      -> Activity.onCreate()
      -> Activity.onStart
      -> Activity.onResume
      -> Activity.onAttachedToWindow
      -> Activity.onWindowFocusChanged
      
  • 如何保持应用的稳定性
    • 经验之谈:性能分析,内存监测,Monkey
  • ThreadLocal
    • 用处:针对线程操作对象,其余线程不能进行操作
    • 原理:ThreadLocal的操作都是针对当前线程持有的一个ThreadLocalMap对象,其内部维护了一个Entry[](弱引用)数组。所以不同线程操作同一个ThreadLocal对象,内部说白了都是操作各个线程自己的ThreadLocalMap对象而已。
  • 谈谈classloader
  • 动态布局
    • 代码写布局,无他唯手熟尔
    • 一篇干货分享一下
  • 热修复,插件化
    • 主观性较强,视个人了解程度而区分。参考
  • HashMap源码,SparseArray原理
  • 应用启动优化
    • 参考Android性能优化
    • 视觉优化,启动界面设置为特殊样式
    • 异步初始化组件;
    • 梳理业务逻辑,延迟初始化组件、操作;
    • 正确使用线程;
    • 去掉无用代码、重复逻辑等;
  • 怎么去除重复代码
    • 抽取成方法,抽取成对象,抽取成Module;
    • 不要过度设计,及时重构,代码要经常回顾;
  • SP是进程同步的吗?有什么方法做到同步
  • SurfaceView介绍
    • View适用于主动更新的情况,而SurfaceView则适用于被动更新的情况,比如频繁刷新界面。
    • View在主线程中对页面进行刷新,而SurfaceView则开启一个子线程来对页面进行刷新。
    • View在绘图时没有实现双缓冲机制,SurfaceView在底层机制中就实现了双缓冲机制
  • HashMap实现原理,ConcurrentHashMap 的实现原理
  • BroadcastReceiver,LocalBroadcastReceiver 区别
    • 应用场景
      • BroadcastReceiver用于应用之间的传递消息;
      • 而LocalBroadcastManager用于应用内部传递消息,比broadcastReceiver更加高效
    • 安全
      • BroadcastReceiver使用的Content API,所以本质上它是跨应用的,所以在使用它时必须要考虑到不要被别的应用滥用
      • LocalBroadcastManager不需要考虑安全问题,因为它只在应用内部有效
  • Bundle、Handler、事件传递机制,都是基础
  • 线程间操作List
  • App启动流程,从点击桌面开始
  • 动态加载(插件化技术)
  • GC回收机制
  • 画出Android大体架构图
    • 经典图
  • 点击 Android Studio 的 build 按钮后发生了什么
    • Android使用gradle构建生成的apk关键就是aapt处理资源文件,aidl处理.aidl,javac生成.class文件,proguard混淆后再由dex生成.dex文件,由apkbuilder签名后再经zipalign对齐字节码就可以上线发布了
    • 这篇文章分析的较为详细,AS的build做了什么
  • 一个应用程序安装到手机上时发生了什么
    • 安装和卸载都是通过PackageManager,实质上是实现了PackageManager的远程服务PackageManagerService来完成具体的操作,所有细节和逻辑均可以在PackageManagerService中跟踪查看;

    • 所有安装方式殊途同归,最终就回到PackageManagerService中,然后调用底层本地代码的installd来完成。再看apk的安装过程。
      • 拷贝apk文件到指定目录
      • 解压apk,拷贝文件,创建应用的数据目录
      • 解析apk的AndroidManifinest.xml文件
      • 向Launcher应用申请添加创建快捷方式
    • 深入探究apk安装过程
  • 对 Dalvik、ART 虚拟机有基本的了解
  • Android 上的 Inter-Process-Communication 跨进程通信时如何工作的
  • Android中App 是如何沙箱化的,为何要这么做
    • Android中的沙箱化可以提升系统安全性和效率
  • 权限管理系统
  • 进程以及Application生命周期
  • Recyclerview和ListView对比
    • 相信目前大部分Android开发已经舍弃了ListView而转向Recyclerview的怀抱了吧,无需赘言。
  • 快速排序以及B+树,算法算是我比较薄弱的环节,不敢多言
  • TCP和UDP的区别
    • TCP是面向连接的协议,提供稳定的双向通信功能,本身提供超时重连机制。UDP是无连接的,提供不稳定的单向通信功能
  • synchronized与Lock的区别
  • volatile
    • 排他锁,保证了所有线程看到的变量都是一致的
  • Java线程池
  • java对象生命周期
    • 经典图例
  • 双亲委派模型
  • Android事件分发机制
    • 基础的基础
  • MVP模式
    • 组件和业务逻辑相互分离,两不相知。Google提供的Demo里,View层级真是纯是view操作,包括Listener的一部分都由Presenter承担了。
    • 接口定义清晰明朗
    • 视个人项目经历而谈,详细了解就仔细说,不太懂就说个大概
  • RxJava
    • 开发神器,错误处理、线程调度、写出来的代码优雅。
    • 可从线程调度以及源码角度剖析剖析。
  • 抽象类和接口的区别
    • 属性和行为的区别
  • Android消息机制
  • 进程调度
  • 进程与线程
    • 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
    • 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
  • 死锁
  • 进程状态
  • JVM内存模型
  • Java 常用并发集合有哪些
    • 非阻塞式列表对应的实现类:ConcurrentLinkedDeque
    • 阻塞式列表对应的实现类:LinkedBlockingDeque
    • 用于数据生成或者消费的阻塞式列表对应的实现类:LinkedTransferQueue
    • 按优先级排序列表元素的阻塞式列表对应的实现类:PriorityBlockingQueue
    • 带有延迟列表元素的阻塞式列表对应的实现类:DelayQueue
    • 非阻塞式列表可遍历映射对应的饿实现类:ConcurrentSkipListMap
    • 随机数字对应的实现类:ThreadLockRandom
    • 原子变量对应的实现类:AtomicLong和AtomicIntegerArray
  • ConcurrentHashMap 的实现原理
  • Java线程run和start方式的区别
  • 常见的数据结构
    • 如图
  • 堆排序实现
  • 链表反转
  • synchronized用法
  • OkHttp是如何处理缓存的
    • OkHttp缓存处理
    • OkHttp还是使用的Http缓存,需要后台配合。当然也可以单纯的在客户端作拦截处理
  • bitmap如何处理大图,如何预防OOM
  • 进程保活
  • listview图片加载错乱的原理和解决方案
  • 广播小结
  • service生命周期
  • 多线程
    • 用RxJava的话会方便很多。RxJava中的多线程,这篇文章真的太赞了
    • AsyncTask 缺陷,一部分是使用不当,一部分是其本身存在的缺陷。网上的大部分文章都是看了一遍其实都是使用的问题,推荐看看这篇详细解读AsyncTask的黑暗面以及一种替代方案【By,AsyncTask真的很难用,因为要注意的地方太多了😒】
  • 数据库数据迁移,把大象装进新冰箱共分几步?
    • 将表名改成临时表ALTER TABLE Order RENAME TO _Order
    • 创建新表 CREATETABLE Test(Id VARCHAR(32) PRIMARY KEY ,CustomName VARCHAR(32) NOTNULL , Country VARCHAR(16) NOTNULL)
    • 导入数据 INSERTINTO Order SELECT id, “”, Age FROM _Order
    • 删除临时表DROPTABLE _Order
  • 设计模式
    • 自由发挥题目。但亦有文章可以参考,这是一个有关Android中常见设计模式解析的一个专栏,推荐指数五颗星Android常见设计模式
  • Java注解
  • Android优化
  • EventBus实现原理
评论