前言
在 Lifecycle 使用与源码分析文章中,我们分析LifecycleRegistry类时,说到新增的Observer都会被添加到mObserverMap里面。而这个mObserverMap就是FastSafeIterableMap,FastSafeIterableMap继承了SafeIterableMap。本篇我们就会讲解一下SafeIterableMap类。
1. FastSafeIterableMap
首先先说一下FastSafeIterableMap类。
FastSafeIterableMap继承了SafeIterableMap并重写了四个方法,相当于在SafeIterableMap又封装了一层。相当于下面这个式子。为什么使用hashap,因为SafeIterableMap并不是hashMap,而是链表,这样查找起来就会比较慢,所以外面套一层HashMap就会比较快。
FastSafeIterableMap = HashMap<K, SafeIterableMap<K, V>>
下面的图表示几者之间的关系关系
public class FastSafeIterableMap<K, V> extends SafeIterableMap<K, V> {
private HashMap<K, Entry<K, V>> mHashMap = new HashMap<>();
@Override
protected Entry<K, V> get(K k) {
return mHashMap.get(k);
}
@Override
public V putIfAbsent(@NonNull K key, @NonNull V v) {
Entry<K, V> current = get(key);
if (current != null) {
return current.mValue;
}
mHashMap.put(key, put(key, v));
return null;
}
@Override
public V remove(@NonNull K key) {
V removed = super.remove(key);
mHashMap.remove(key);
return removed;
}
public boolean contains(K key) {
return mHashMap.containsKey(key);
}
public Map.Entry<K, V> ceil(K k) {
if (contains(k)) {
return mHashMap.get(k).mPrevious;
}
return null;
}
}
2. SafeIterableMap
Structure图如下图所示,也是比较简单的一个类。
SafeIterableMap 具有以下特性:
- 支持键值对存储,用链表实现,模拟成Map的接口
- 支持在遍历的过程中删除任意元素,不会触发ConcurrentModifiedException
- 非线程安全
2.1 Entry
从SafeIterableMap开始看起:
public class SafeIterableMap<K, V> implements Iterable<Map.Entry<K, V>> {
//开始的入口
Entry<K, V> mStart; //这个链表的开始节点
private Entry<K, V> mEnd; //这个链表最后也就是最新的节点
// using WeakHashMap over List<WeakReference>, so we don't have to manually remove WeakReferences that have null in them. supportRemove字面理解可能是支持删除,也就是在迭代的时候支持删除操作
private WeakHashMap<SupportRemove<K, V>, Boolean> mIterators = new WeakHashMap<>();
private int mSize = 0;
和HashMap一样,WeakHashMap 也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以是null。
不过WeakHashMap的键是“弱键”。在 WeakHashMap 中,当某个键不再正常使用时,会被从WeakHashMap中被自动移除。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。某个键被终止时,它对应的键值对也就从映射中有效地移除了。最适合的场景就是用在缓存上面。
和HashMap一样,WeakHashMap是不同步的。可以使用 Collections.synchronizedMap 方法来构造同步的 WeakHashMap。
从开始的定义发现,首先需要要看一下Entry。
这里说一下Map.Entry。它是MAP里面的一个条目(键值对),可以通过Map.entrySet方法返回它。想要获得对条目的引用,必须使