LinkedHashMap源码解读

本文详细解读了LinkedHashMap的源码,包括构造函数、数据结构、存取元素的过程,以及accessOrder属性对迭代顺序的影响。当accessOrder为true时,get操作会改变元素顺序;为false则按插入顺序迭代。错误的迭代方式是先通过key获取HashMap,正确方式应直接迭代LinkedHashMap。
摘要由CSDN通过智能技术生成

LinkedHashMap是HashMap的子类,唯一的区别在于LinkedHashMap对顺序的维护,是有序

构造函数

public LinkedHashMap(int initialCapacity, float loadFactor) {
	super(initialCapacity, loadFactor);
	accessOrder = false;
}
public LinkedHashMap(int initialCapacity) {
	super(initialCapacity);
	accessOrder = false;
}
public LinkedHashMap() {
	super();
	accessOrder = false;
}
public LinkedHashMap(Map<? extends K, ? extends V> m) {
	super(m);
	accessOrder = false;
}
public LinkedHashMap(int initialCapacity,
					 float loadFactor,
					 boolean accessOrder) {
	super(initialCapacity, loadFactor);
	this.accessOrder = accessOrder;
}

构造函数参数容量,加载因子都继承hashMap,唯一的区分在于对于属性accessOrder的维护

/**
     * The iteration ordering method for this linked hash map: <tt>true</tt>
     * for access-order, <tt>false</tt> for insertion-order.
     *
     * @serial
     */
    private final boolean accessOrder;

accessOrder字段表示对顺序的维护。true表示按照访问顺序,false表示按照插入顺序(插入可能不是在尾部顺序添加,可能是按照索引添加,顺序可能不一致)

LinkedHashMap构造默认是维护元素插入的顺序

linkedHashMap的数据结构的最小单元

private static class Entry<K,V> extends HashMap.Entry<K,V> {
        // These fields comprise the doubly linked list used for iteration.
        Entry<K,V> before, after;

        Entry(int hash, K key, V value, HashMap.Entry<K,V> next) {
            super(hash, key, value, next);
        }

        /**
         * Removes this entry from the linked list.
         */
        private void remove() {
            before.after = after;
            after.before = before;
        }

在HashMap.Entry的基础上新增了两个属性before,after 表示 顺序上的前一个元素的地址和后一个元素的地址,而原next只是表示在一个数组位置处的链表上的,下一个元素位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值