Retrofit的实现与原理
关键字: 动态代理
HashMap原理
关键字:数组散列+单链表
HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
https://www.cnblogs.com/chengxiao/p/6059914.html
HashMap怎么解决Hash冲突
关键字:“拉链法”
https://xiaolu123456.iteye.com/blog/1485349
Android两种虚拟机
Dalvik :
Android4.4及以前使用的都是Dalvik虚拟机,我们知道Apk在打包的过程中会先将java等源码通过javac编译成.class文件,但是我们的Dalvik虚拟机只会执行.dex文件,这个时候dx会将.class文件转换成Dalvik虚拟机执行的.dex文件。Dalvik虚拟机在启动的时候会先将.dex文件转换成快速运行的机器码,又因为65535这个问题,导致我们在应用冷启动的时候有一个合包的过程,最后导致的一个结果就是我们的app启动慢,这就是Dalvik虚拟机的JIT特性(Just In Time)
ART:
ART虚拟机是在Android5.0才开始使用的Android虚拟机,ART虚拟机必须要兼容Dalvik虚拟机的特性,但是ART有一个很好的特性AOT(ahead of time),这个特性就是我们在安装APK的时候就将dex直接处理成可直接供ART虚拟机使用的机器码,ART虚拟机将.dex文件转换成可直接运行的.oat文件,ART虚拟机天生支持多dex,所以也不会有一个合包的过程,所以ART虚拟机会很大的提升APP冷启动速度。
ART优点:
1.加快APP冷启动速度
2.提升GC速度
3.提供功能全面的Debug特性
ART缺点:
1.APP安装速度慢,因为在APK安装的时候要生成可运行.oat文件
2.APK占用空间大,因为在APK安装的时候要生成可运行.oat文件
GC机制
算法:根搜索算法(GC Roots根节点)
https://blog.csdn.net/anjoyandroid/article/details/78609971
Activity的onNewIntent
- 通过Intent启到一个Activity的时候,就算已经存在一个相同的正在运行的Activity,系统也会创建一个新的Activity实例。为了不让Activity实例化多次,我们需要通过在AndroidManifest.xml配置启动方式。
- launchMode为singleTask的时候,通过Intent跳到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候----------系统就不会再调用onCreate方法,而是调用onNewIntent方法。
能用到的地方是A-->B-->C-->A,此时onActivityResult就有些复杂了。
类加载机制
类的生命周期:加载---验证---准备---解析---初始化---使用---卸载
ActivityThread工作流程
- 首先通过myLooper()方法获取Looper对象,取出Looper持有的MessageQueue;
- 然后从MessageQueue取出Message,如果Message为null,说明线程正在退出;
- Message不为空,则调用Message的target handler对该Message进行分发;
- 消息处理完毕,调用recycle()方法进行回收。
Binder机制
每一个Android的进程都只会运行在自己进程所拥有的虚拟地址空间。每个虚拟地址空间又分割为用户空间和内核空间两种。对于用户空间,不同进程之间是不能共享的,而内核空间是可以共享。
RecycleView与ListView之间的关系
https://blog.csdn.net/shu_lance/article/details/79566189
Thread.sleep()与Thread.wait()方法的区别
- sleep()方法是Thread类的方法,主要的意义就是让当前线程停止执行,让出cpu给其他的线程,但是 不会释放对象锁资源以及监控的状态 ,当指定的时间到了之后又会自动恢复运行状态。
- wait()方法是Object类里面的,主要的意义就是让线程放弃当前的对象的锁,进入等待此对象的等待锁定池,只有针对此对象调动notify方法后本线程才能够进入对象锁定池准备获取对象锁进入运行状态。
Java中线程间通讯
- 同步 synchronized关键字
- wait/notify机制
http://www.cnblogs.com/hapjin/p/5492619.html
Synchronized修饰static方法与非static方法之间的区别
- 当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例),作用范围是整个静态方法,作用的对象是这个类的所有对象。
- 当synchronized修饰一个非static方法时,多线程下,获取的是对象锁(即类的实例对象),作用范围是整个方法,作用对象是调用该方法的对象。
安卓开发怎么实现延迟加载
ViewStub 是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,避免资源浪费,在需要的时候才加载View
https://blog.csdn.net/jason0539/article/details/26132267
网友评论