Android 源码系列之【二十一】从源码的角度深入理解SafeIterableMap

本文详细介绍了Android中的SafeIterableMap类,它模拟Map功能,支持在遍历期间删除元素。不同于HashMap,SafeIterableMap采用链表结构,允许在迭代时修改,但不保证线程安全。文章通过源码分析,揭示了其put、get、remove方法的工作原理,以及迭代器的实现,包括如何处理在遍历过程中添加新元素的情况。
摘要由CSDN通过智能技术生成

转载请注明出处:https://blog.csdn.net/llew2011/article/details/85222413

说起HashMap想必小伙伴们都非常熟悉吧,它出现在面试中的概率是很高的,网上有很多文章对它的实现原理做了详细的分析,这里不再做过多的论述,今天给大家带来的是一个新的集合类SafeIterableMap,直接看名字貌似是一个Map类,但是它并没有实现Map接口,而是采用链表和键值对的存储方式来模拟Map的功能,它的核心就是支持在遍历元素的时候对元素进行删除操作。

在17年的Google IO大会上,官方发布了一套用来帮助开发者解决架构设计的方案库:Android Architecture Components,并在GitHub上给出了Simple:https://github.com/googlesamples/android-architecture-components,我在运行官方给的Simple后为了弄清楚它的原理,就着手阅读了它的源码,在阅读源码的过程中发现了一个比较好使的类SafeIterableMap,当时就计划写篇文章详细讲解一下该类,但是只写到一半就沉睡到草稿箱了......现对这篇文章补充完整并发表出来,希望能给小伙伴一点帮助......

SafeIterableMap类的官方说明如下:

/**
 * LinkedList, which pretends to be a map and supports modifications during iterations.
 * It is NOT thread safe.
 *
 * @param <K> Key type
 * @param <V> Value type
 * @hide
 */
public class SafeIterableMap<K, V> implements Iterable<Map.Entry<K, V>> {
    ...
}

SafeIterableMap实现了Iterable接口,它是一个链表结构,模拟了Map的特性,支持在对元素遍历期间做修改,但需要注意的是该类不是线程安全的。既然是链表结构,那就应该有表示Node结点并且还有Node结点的个数的属性,我们接着看它的源码:

private 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.
private WeakHashMap<SupportRemove<K, V>, Boolean> mIterators = new WeakHashMap<>();
private int mSize = 0;

SafeIterableMap的属性仅仅有4个,mStart代表着头结点,mEnd表示尾结点,他们的类型是Entry类型,mSize代表当前结点的数量,mIterators是一个弱引用集合(小伙伴们都应该清楚弱引用集合相对于强引用集合来说就是为了防止出现内存泄露的),它的具体作用我们稍后再看,先看一下Entry的源码,如下:

static class Entry<K, V> implements Map.Entry<K, V> {
    @NonNull
    final K mKey;
    @NonNull
    final V mValue;
    Entry<K, V> mNext;
    Entry<K, V> mPrevious;

    Entry(@NonNull K key, @NonNull V value) {
        mKey = key;
        this.mValue = value;
    }

    @NonNull
    @Override
    public K getKey() {
        return mKey;
    }

    @NonNull
    @Override
    public V getValue() {
        return mValue;
    }

    @Override
    public V setValue(V value) {
        throw new UnsupportedOperationException("An entry modification is no
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值