在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中的存储顺序。
网友评论