Android面试题 - LruCache
一、原理
LruCache 其实挺简单的,本质是对LinkHashMap
的封装,然后通过设置maxSize
来控制LinkHashMap
的容量。
二、注意点
2.1 LruCache 是线程安全的
它的所有属性都是私有属性
对私有属性的setter
和getter
操作都是加了锁处理
2.2 key/value不能为null
和HashMapbuts,LruCache put时不允许key和vale都不能为空
2.3 maxSize 不一定生效
LruCache是通过sizeOf()
计算value
的大小的,默认情况下,只会返回1,也就是LinkHashMap
的容量加一。
如果用LruCache缓存Bitmap
等对象,那么LruCache可能永远也不会释放,因为对于缓存Bitamp来说,一般情况下,ma xsize都会设置为10m
,这样的话,map的容量要到10m
的条目数才会释放一个Bitmap
。
解决方案是,创建LruCache
时重写sizeOf
方法:
int cacheSize = 4 * 1024 * 1024; // 4MiB |
2.4 返回默认的返回值
由于LruCache是对LinkHashMap的封装,因此,当key对应的value不存在时,会返回null,如果你需要不返回null,可以通过覆盖create()
方法创建默认的返回值。
int cacheSize = 20; |
2.5 在对象被移除之前操作对象
如果你希望在对象被回收之前做一些额外的超过,比如:移除Bitmap时,主动释放Bitmap,那么可以重写entryRemoved
方法。
int cacheSize = 4 * 1024 * 1024; // 4MiB |
Android面试题 - LruCache