美文网首页
LinkedHashMap中的accessOrder

LinkedHashMap中的accessOrder

作者: littleGrow | 来源:发表于2018-10-31 18:18 被阅读0次

    在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方法,那么我们来看看这个方法到底是做什么的呢?

    图1

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

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

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

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

    相关文章

      网友评论

          本文标题:LinkedHashMap中的accessOrder

          本文链接:https://www.haomeiwen.com/subject/jlxztqtx.html