Java之LinkedHashMap源码分析(第一篇:初步了解)

(注意:本文基于JDK1.8)

前言

    HashMap是我们经常使用的容器对象,遍历HashMap持有的元素时,没有任何顺序而言,HashMap遍历元素的顺序,与你插入元素、访问元素都没有任何关系!很多时候,我们需要一个特定的顺序去遍历HashMap存储的元素,比如需要按照元素插入的顺序遍历或者按照元素被访问的顺序遍历元素,但是HashMap不行,HashMap只能依照Key对象的hashCode()方法生成桶地址顺序遍历(这个不可控)!那么如何做到按照某个特定顺序遍历Map中的元素呢?

答案:LinkedHashMap支持按照插入元素的顺序去遍历所有元素,也支持按照元素的访问顺序去遍历所有元素!

LinkedHashMap支持2种有序的方式遍历元素,它们是

1:按照元素插入的先后顺序遍历元素(默认),此时遍历元素的顺序与你插入元素时的顺序一致

2:按照元素访问的先后顺序遍历元素,此时遍历元素的顺序与你访问每个元素的顺序一致(如果没有访问过元素呢?相信学习完这一系列文章,你应该能找到答案)

 

LinkedHashMap保持遍历元素有序的技术点

1、LinkedHashMap对象持有一个双向链表,这就是LinkedHashMap可以遍历所有元素时保持有序的原因!

    transient LinkedHashMap.Entry<K, V> head;
    transient LinkedHashMap.Entry<K, V> tail;

LinekdHashMap对象持有的实例变量head表示双向链表的第一个结点,持有的另一个实例变量tail表示双向链表的最后一个结点

 

2、Entry结点类

Entry类定义在LinkedHashMap的内部,它产生的每个对象表示双向链表的一个结点

    static class Entry<K, V> extends Node<K, V> {
        LinkedHashMap.Entry<K, V> before;
        LinkedHashMap.Entry<K, V> after;

        Entry(int var1, K var2, V var3, Node<K, V> var4) {
            super(var1, var2, var3, var4);
        }
    }

Entry类作为静态内部类定义在LinkedHashMap中,Entry继承了HashMap中定义的静态内部类Node,在Node类的基础上新增一个表示前驱结点的实例变量before,新增一个表示后继结点的实例变量after,这样的结点对象就可以作为双向链表的结点了

 

3、LinkedHashMap对象支持两种遍历元素顺序的方式,遍历元素的顺序取决于当前LinkedHashMap对象持有的一个标志位accessOrder

final boolean accessOrder;

false:代表按照插入元素的顺序去组织双向链表(默认)

true:代表按照访问元素的顺序去组织双向链表

 

4、LinkedHashMap对象持有的accessOrder在哪赋值?

accessOrder由final修饰,所以它是在创建LinkedHashMap对象的时候必须显式赋值,它是在构造方法中赋值的,中途无法更改(忽略反射方式)

LinkedHashMap提供5个构造方法用于创建对象,截图红圈处的那个构造方法可以指定accessOrder的值,其他构造方法accessOrder的初始值均是false!

true:表示按照元素访问顺序

false:表示按照元素插入顺序

 

LinkedHashMap类结构

public class LinkedHashMap<K,V>
    extends HashMap<K,V>
    implements Map<K,V>
{
    ………………省略很多代码………………
}

    LinkedHashMap继承HashMap并实现了Map接口,如果你熟悉HashMap,一定记得在父类的HashMap中定义了3个空的方法,这3个空的方法正是给LinkedHashMap使用的……LinkedHashMap与HashMap的多数功能是一样的,LinkedHashMap只是比HashMap支持按照元素的插入顺序或者访问顺序遍历元素的功能,所以LinkedHashMap继承HashMap再合适不过!

 

LinekdHashMap重写父类的3个方法(模版方法设计模式牛X应用)

    LinkedHashMap重写了HashMap中的定义的3个空的方法,这三个方法是:

1、afterNodeAccess方法

2、afterNodeInsertion方法

3、afterNodeRemoval方法

    void afterNodeAccess(HashMap.Node<K, V> var1) {
    }

    void afterNodeInsertion(boolean var1) {
    }

    void afterNodeRemoval(HashMap.Node<K, V> var1) {
    }

   

LinekdHashMap重写了newNode()方法

    LinkedHashMap也重写了另一个重要的创建结点对象的newNode方法,该newNode方法负责创建Entry对象

    Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
        LinkedHashMap.Entry<K,V> p =
            new LinkedHashMap.Entry<K,V>(hash, key, value, e);
        linkNodeLast(p);
        return p;
    }

 

总结

    LinkedHashMap也是一个只能在单线程下使用的容器对象,我们接下来一起详细学习LinkedHashMap对象的创建、插入元素、删除元素、遍历元素、以及LinkedHashMap是如何巧妙在HashMap基础上做到保持有序的…………请看下一篇…………

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提高农业生产效率,保障食品安全,实现资的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更加科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、加工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,加强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本高、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和高效化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值