转载请注明出处: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