Lifecycle之SafeIterableMap

本文深入探讨了Android Lifecycle中的SafeIterableMap及其子类FastSafeIterableMap。FastSafeIterableMap是对SafeIterableMap的封装,提高查找效率。SafeIterableMap是一个非线程安全的键值对存储,支持在遍历过程中删除元素且避免ConcurrentModifiedException。文章详细介绍了Entry、get、put、putIfAbsent、Iterator以及remove等操作,并指出其在LiveData中的高效应用。
摘要由CSDN通过智能技术生成

前言

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方法返回它。想要获得对条目的引用,必须使

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值