LinkedHashMap中的accessOrder

在Android-28中查看LinkedHashMap的源码:

我们发现LinkedHashMap的构造函数中比起父类HashMap多了一个accessOrder的东西,且默认accessOrder的值为false,只有在下面的构造函数中可以设置为true。

public LinkedHashMap(int initialCapacity,

                    float loadFactor,

                    boolean accessOrder) {

    super(initialCapacity, loadFactor);

    this.accessOrder = accessOrder;

}

那么accessOrder到底有什么用呢?

我们在源码中找到accessOrder使用的地方,发现如下:

public V get(Object key) {

    Node<K,V> e;

    if ((e = getNode(hash(key), key)) == null)

        return null;

    if (accessOrder)

        afterNodeAccess(e);

    return e.value;

}

当然还可以看到另一个方法getOrDefault,由于在accessOrder的使用上和上面方法一样,我们以上面的方法来说明。

我们看到在调用LinkedHashMap的get方法后,如果accessOrder为true,则调用了afterNodeAccess方法,那么我们来看看这个方法到底是做什么的呢?

《LinkedHashMap中的accessOrder》 图1

在图1中我们看到该方法最大的作用就是改变LinkedHashMap的尾部节点。

当accessOrder为true时,我们每次调用get方法时都会调用该方法,将我们访问的Node移动到最后,使之成为尾部节点,从而改变了数据在LinkedHashMap中的存储顺序。

对我们平时简单使用LinkedHashMap来说一般该值为false,对数据的存储顺序没什么影响,那它的使用场景在什么地方呢?我们可以在LruCache中找到。

所以说accessOrder的作用就是控制访问顺序,设置为true后每次访问一个元素,就将该元素所在的Node变成最后一个节点,改变该元素在LinkedHashMap中的存储顺序。

    原文作者:littleGrow
    原文地址: https://www.jianshu.com/p/0931458cee36
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞