简介 HashSet是一个基于HashMap实现的无重复元素的集合。 原理 private transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Ob...
Lrucache源码解析
简介 LruCache是一个范型类,内部使用了一个LinkedHashMap来储存传入的对象。主要提供put和get方法来添加和获取。当添加元素后缓存移出后时,LruCache会移出较早使用的缓存对象。 另外LruCache是一个线程安全的类,内部使用了比较多的锁来维护元素的安全访问。 与HashMap有区别的是,key与value都不支持为null。 主要构成 p...
LinkedHashMap源码解析(JDK8)
简介 LinkedHashMap继承至HashMap,对HashMap进行了增强。主要是HashMap是无序的,不能保持插入顺序,而LinkedHashMap对HashMap的Node节点进行了增强。支持了保持插入顺序或者按访问顺序排序。 构造函数 transient LinkedHashMapEntry<K,V> head; transient LinkedHashM...
HashMap源码解析(JDK8)
简介 Hashmap是key-value格式的键值对储存容器,key与value都支持null,但非线程安全,若需要线程安全可以使用ConcurrentHashMap。 原理 构造函数 // 最大容量 static final int MAXIMUM_CAPACITY = 1 << 30; // 默认因子为0.75,即size达到最大容量的0.75时执行扩容 sta...
Bitmap简介
简介 bitmap翻译为位图,指的是一张图片。是安卓中常用于操作图像的一个类,提供图片加载、裁剪、旋转等诸多操作。 创建 Bitmap提供多种构建方式 Bitmap.createBitmap()的一系列重载 BitmapFactory的一系列方法 加载图片 可以使用BitmapFactory来从文件系统、资源、输入流以及字节数组中加载出一个bitmap对象。 因为Bit...
Android Density屏幕适配
简介 对于常见的项目中,UI都会以宽为基准来出图,这时就会以固定的屏幕宽度来定稿。但是安卓屏幕各异,密度各不相同,所以不能简单的直接使用dp来定义UI的样式。 DPI 在Android中,DPI表示屏幕像素密度。表示单位长度上对应的像素个数。在resource中有一个displayMetrics管理着对应的值。displayMetrics中有两个重要的参数 densityDpi...
Binder进程间通信
简介 同一个程序中的两个函数之间能直接调用的根本原因是处于相同的内存空间中,虚拟地址的映射规则完全一致,所以可以直接相互调用。而两个不同的进程,是没有办法通过内存地址来访问对方内部函数和变量的,既然无法直接访问对方进程的内容,这时就可以用到Binder来间接访问对方的内容。 binder主要分为一下四部分内容: Binder驱动 Service Manager Binde...
ArrayList源码解析(JDK8)
简介 ArrayList是基于数组的非线程安全的列表,提供O(1)的随机访问能力,增加和删除效率较低。 构造方法 private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; transie...
Handler分析
使用 创建哪个线程的handler,这个线程必须要有looper handler的时间指的是开机之后的毫秒数 SystemClock.uptimeMillis() 主线程handler的一般使用 //创建主线程的handler private val handler = object :Handler(Looper.getMainLooper()){ override fu...
JNI的基础使用
JNI介绍 主要使用场景 应用程序需要一些平台相关的feature的支持,而Java无法满足。 兼容以前的用其他语言书写的代码库。使用JNI技术可以让Java层的代码访问到这些旧库,实现一定程度的代码复用。 应用程序的某些关键操作对运行速度要求较高。这部分代码可以用底层语言如汇编写,再通过JNI向 Java层提供访问接口。 使用步骤 将需要本地实现的Java方法...