返回顶部
首页 > 资讯 > 精选 >Java中LinkedHashMap是什么
  • 935
分享到

Java中LinkedHashMap是什么

2023-06-15 05:06:21 935人浏览 八月长安
摘要

这篇文章给大家分享的是有关Java中LinkedHashMap是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、成员变量先来看看存储元素的结构吧:static class Entry&l

这篇文章给大家分享的是有关Java中LinkedHashMap是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、成员变量

先来看看存储元素的结构吧:

static class Entry<K,V> extends HashMap.node<K,V> {    Entry<K,V> before, after;    Entry(int hash, K key, V value, Node<K,V> next) {        super(hash, key, value, next);    }}

这个Entry在HashMap中被引用过,主要是为了能让LinkedHashMap也支持树化。在这里则是用来存储元素。

// 双向链表的头,用作AccessOrder时也是最老的元素transient LinkedHashMap.Entry<K,V> head;// 双向链表的尾,用作AccessOrder时也是最新的元素transient LinkedHashMap.Entry<K,V> tail;// true则为访问顺序,false则为插入顺序final boolean accessOrder;

二、构造函数

关于LinkedHashMap的构造函数我们只关注一个,其他的都和HashMap类似,只是把accessOrder设置为了false。在上边的文档说过,initialCapacity并没有在HashMap中那般重要,因为链表不需要像数组那样必须先声明足够的空间。下面这个构造函数是支持访问顺序的。

// 双向链表的头,用作AccessOrder时也是最老的元素transient LinkedHashMap.Entry<K,V> head;// 双向链表的尾,用作AccessOrder时也是最新的元素transient LinkedHashMap.Entry<K,V> tail;// true则为访问顺序,false则为插入顺序final boolean accessOrder;

三、重要方法

LinkedHashMap并没有再实现一整套增删改查的方法,而是通过复写HashMap在此过程中定义的几个方法来实现的。对此不熟悉的可以查看上一篇关于HashMap分析的文章,或者对照HashMap的源码来看。

1、插入一个元素

HashMap在插入时,调用了newNode来新建一个节点,或者是通过replacementNode来替换值。在树化时也有两个对应的方法,分别是newTreeNode和replacementTreeNode。完成之后,还调用了afterNodeInsertion方法,这个方法允许我们在插入完成后做些事情,默认是空实现。

为了方便分析,我们会对比HashMap中的实现与LinkedHashMap的实现,来摸清它是如何做的。

// HashMap中的实现Node<K, V> newNode(int hash, K key, V value, Node<K, V> next) {    return new Node<>(hash, key, value, next);}// LinkedHashMap中的实现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;}// HashMap中的实现Node<K, V> replacementNode(Node<K, V> p, Node<K, V> next) {    return new Node<>(p.hash, p.key, p.value, next);}// LinkedHashMap中的实现Node<K,V> replacementNode(Node<K,V> p, Node<K,V> next) {    LinkedHashMap.Entry<K,V> q = (LinkedHashMap.Entry<K,V>)p;    LinkedHashMap.Entry<K,V> t =        new LinkedHashMap.Entry<K,V>(q.hash, q.key, q.value, next);    transferLinks(q, t);    return t;}// newTreeNode和replacementTreeNode和此类似

通过以上对比,可以发现,LinkedHashMap在新增时,调用了linkNodeLast,再替换时调用了transferLinks。以下是这两个方法的实现。

// 就是将元素挂在链尾private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {    LinkedHashMap.Entry<K,V> last = tail;    tail = p;    if (last == null)        head = p;    else {        p.before = last;        last.after = p;    }}// 用dst替换srcprivate void transferLinks(LinkedHashMap.Entry<K,V> src,                            LinkedHashMap.Entry<K,V> dst) {      LinkedHashMap.Entry<K,V> b = dst.before = src.before;    LinkedHashMap.Entry<K,V> a = dst.after = src.after;    if (b == null)        head = dst;    else        b.after = dst;    if (a == null)        tail = dst;    else        a.before = dst;}

最后我们看下afterNodeInsertion做了哪些事情吧:

// evict在HashMap中说过,为false表示是创建阶段void afterNodeInsertion(boolean evict) { // possibly remove eldest    LinkedHashMap.Entry<K,V> first;    // 不是创建阶段    if (evict && (first = head) != null && removeEldestEntry(first)) {        K key = first.key;        // 自动删除最老的元素,也就是head元素        removeNode(hash(key), key, null, false, true);    }}

removeEldestEntry是当想要在插入元素时自动删除最老的元素时需要复写的方法。其默认实现如下:

protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {    return false;}

2、查询

因为要支持访问顺序,所以获取元素的方法和HashMap也有所不同。下面我们看下其实现:

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;}

getNode方法是在HashMap中实现的,所以这是包装了一下HashMap的方法,并添加了一个afterNodeAccess,其实现如下:

void afterNodeAccess(Node<K,V> e) { // move node to last    LinkedHashMap.Entry<K,V> last;    // e元素不在末尾    if (accessOrder && (last = tail) != e) {        // p是e,b是前一个元素,a是后一个元素        LinkedHashMap.Entry<K,V> p =            (LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;        // e要放在末尾,所以没有after        p.after = null;        // 把e去掉,把b和a接起来        if (b == null)            head = a;        else            b.after = a;        if (a != null)            a.before = b;        else            last = b;        //把e接在末尾        if (last == null)            head = p;        else {            p.before = last;            last.after = p;        }        tail = p;        ++modCount;    }}

java基本数据类型有哪些

Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据类型。3、字符类型,字符类型的关键字是“char”。4、布尔类型,是表示逻辑值的基本数据类型。

感谢各位的阅读!关于“Java中LinkedHashMap是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Java中LinkedHashMap是什么

本文链接: https://lsjlt.com/news/277910.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中LinkedHashMap是什么
    这篇文章给大家分享的是有关Java中LinkedHashMap是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、成员变量先来看看存储元素的结构吧:static class Entry&l...
    99+
    2023-06-15
  • Java中LinkedHashMap 的底层原理是什么
    本篇文章为大家展示了Java中LinkedHashMap 的底层原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。默认情况下,LinkedHashMap的迭代顺序是按照插入节点的顺序。也可以通...
    99+
    2023-06-15
  • 详解Java中LinkedHashMap
    初识LinkedHashMap大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。HashMap的这一缺点往往会带来...
    99+
    2023-05-31
    linkedhashmap ava j
  • java中HashMap和LinkedHashMap的区别
    HashMaphashMap是最常用的Map,根据键的HashCode值存储数据,可以根据键直接获取它的值,具有很快的访问速度,遍历时候的顺序是完全随机的。HashMap只允许一个键为Null,允许多个值为Null。特性: 完全随机优点: ...
    99+
    2019-03-31
    java HashMap LinkedHashMap 区别
  • 怎么在java中使用LinkedHashMap添加元素
    怎么在java中使用LinkedHashMap添加元素?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为...
    99+
    2023-06-14
  • LinkedHashMap在Java中的作用有哪些
    今天就跟大家聊聊有关LinkedHashMap在Java中的作用有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。LinkedHashMap实现Map继承HashMap,基于Map...
    99+
    2023-05-31
    java linkedhashmap
  • java中LinkedHashMap和HashMap的区别有哪些
    这篇文章主要介绍了java中LinkedHashMap和HashMap的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java的优点是什么1. 简单,只需理解基本的...
    99+
    2023-06-14
  • java中是什么是NIO
    java中是什么是NIO?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了...
    99+
    2023-06-14
  • java中什么是包?
    为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。(推荐:java视频教程)包的作用把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不...
    99+
    2014-10-17
    java
  • java中什么是this
    this关键字是什么?关键字this只能在方法内部使用,表示对当前对象的引用。this关键字的用法访问成员变量,区分成员变量和局部变量访问成员方法访问构造方法返回对当前对象的引用将对当前对象的引用作为参数传递给其他方法用法如下:Test05...
    99+
    2021-02-20
    java this
  • java中什么是T?
    java中什么是T?T是Java泛型中的一个标记符号,代表Type(Java 类)。Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本...
    99+
    2020-03-15
    java入门 java T 泛型
  • java中包是什么
    java中的包其实就是类所在的文件夹,用来组织java文件的。可以将功能相似的一些java类放在同一个包中,以方便组织、调用。只要用package声明包就可以了。如果使用Eclipse等工具,可以直接在项目中创建包,如果手工编写,可以在项目...
    99+
    2019-11-20
    java入门 java
  • java中类是什么
    类就是具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象。在面向对象的程序设计语言中,类是对一类“事物”的属性与行为的抽象。举一个例子说明下类,比如Person(人)就是一个类,那么具体的某个人“张三”就是...
    99+
    2017-10-14
    java入门 java
  • java中api是什么?
    API(Application Programming Interface,应用程序编程接口)是java提供的一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节...
    99+
    2014-09-16
    java教程 java api
  • java中char是什么?
    char是Java中的保留字,表示一种数据类型。与别的语言不同的是,char在Java中是16位的,因为Java用的是Unicode编码。不过8位的ASCII码包含在Unicode编码中,其值对应于0~127。char是Java八大基本数据...
    99+
    2018-05-23
    java入门 java char
  • Java中main是什么
    main方法是一个特殊的方法,是程序执行的入口,一个Java程序从main方法开始执行。Java虚拟机在执行Java程序之前会事先分配一个主线程,然后在主线程里面执行我们这个main方法,明白了吧?所以我们经常说main方法叫主线程! ...
    99+
    2021-11-26
    java入门 Java
  • java中rmi是什么
    java中rmi是指一种分布式对象应用;它属于java的远程方法调用,类似于rpc,它能够让在某个Java虚拟机上的对象调用另一个 Java虚拟机中的对象上的方法。RMI (Remote Method Invocation) 模型是一种分布...
    99+
    2024-04-02
  • java中ThreadLocal是什么
    ThreadLocal是JDK包提供的,称为线程本地变量,它将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本,通过ThreadLocal可以将对象的可见范围限制在同一个线程内,从而避免了线程安全问题,对解决多线程程序的并发问题有一...
    99+
    2024-04-02
  • java中什么是SocketChannel
    java中什么是SocketChannel?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代...
    99+
    2023-06-14
  • java中什么是jstack
    本篇文章给大家分享的是有关java中什么是jstack,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。js的作用是什么1、能够嵌入动态文本于HTML页面。2、对浏览器事件做出响应...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作