Java 中的 LinkedHashMap

news2024/10/7 15:21:27

让我们从一个简单的 Java 代码片段开始,演示如何在 Java 中创建和使用 LinkedHashMap。

import java.util.LinkedHashMap;

public class LinkedHashMapCreation {
    public static void main(String[] args) {
        
        // Create a LinkedHashMap of Strings (keys) and Integers (values)
        LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
        
        // Displaying the LinkedHashMap
        System.out.println("LinkedHashMap Elements: " + linkedHashMap);
    }
}

输出

LinkedHashMap Elements::{}

        LinkedHashMap类与HashMap类似,但有一个附加功能,即维护插入元素的顺序。HashMap 具有快速插入、搜索和删除的优势,但它从不维护插入的轨迹和顺序,而 LinkedHashMap 则提供了可以按插入顺序访问元素的功能。 

LinkedHashMap 的特点:

    LinkedHashMap 包含基于键的值。它实现 Map 接口并扩展 HashMap 类。

    它仅包含唯一元素。

    它可能有一个空键和多个空值。

    它是非同步的。

    它与 HashMap 相同,但有一个额外的特性,即它维护插入顺序。例如,当我们使用 HashMap 运行代码时,我们会得到不同的元素顺序。

LinkedHashMap的声明:

public class LinkedHashMap<K,​V> extends HashMap<K,​V> implements Map<K,​V>

其中,K是键对象类型,V是值对象类型

K:地图中键的类型。

V:地图中映射的值的类型。

LinkedHashMap 内部如何工作?

LinkedHashMap是HashMap类的扩展,它实现了Map接口。因此,该类声明如下:

public class LinkedHashMap 
extends HashMap 
implements Map 

        在这个类中,数据是以节点的形式存储的。LinkedHashMap 的实现与双向链表非常相似。因此,LinkedHashMap 的每个节点表示为:

Hash:所有输入的键都转换为哈希,即键的较短形式,以便更快地进行搜索和插入。
Key:由于该类扩展了HashMap,数据是以键值对的形式存储的。因此,该参数是数据的键。
Value:每个键都有一个与之关联的值。此参数存储键的值。由于泛型,此值可以是任何形式。
Next:由于 LinkedHashMap 存储了插入顺序,因此它包含了 LinkedHashMap 下一个节点的地址。
Previous:此参数包含LinkedHashMap前一个节点的地址。 

同步 LinkedHashMap
        LinkedHashMap 的实现不是同步的。如果多个线程同时访问链接哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部对其进行同步。这通常通过同步自然封装映射的某个对象来实现。如果不存在这样的对象,则应使用Collections.synchronizedMap方法“包装”映射。最好在创建时完成此操作,以防止意外对映射进行非同步访问:

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

LinkedHashMap 类的构造函数
        为了创建LinkedHashMap,我们需要创建 LinkedHashMap 类的对象。LinkedHashMap 类由各种构造函数组成,这些构造函数允许创建 ArrayList。以下是此类中可用的构造函数:

1. LinkedHashMap():这个用于构造一个默认的LinkedHashMap构造函数。

LinkedHashMap<K,V> lhm = new LinkedHashMap<K,V>();


2. LinkedHashMap(int capacity):用于初始化具有指定容量的特定LinkedHashMap。

LinkedHashMap<K,V> lhm = new LinkedHashMap<K,V>(int capacity);


3. LinkedHashMap(Map <? extends K ,​? extends V > map ):用于使用指定映射的元素初始化特定的 LinkedHashMap。

LinkedHashMap<K,V> lhm = new LinkedHashMap<K,V>(Map<? extends K,​? extends V> map);


4. LinkedHashMap(int capacity, float fillRatio):用于初始化 LinkedHashMap 的容量和填充率。fillRatio 也称为loadFactor,是一种确定何时自动增加 LinkedHashMap 大小的指标。默认情况下,此值为 0.75,这意味着当地图已满 75% 时,地图的大小会增加。

LinkedHashMap<K,V> lhm = new LinkedHashMap<K,V>(int capacity,float fillRatio);


5. LinkedHashMap(int capacity, float fillRatio, boolean Order):此构造函数也用于初始化 LinkedHashMap 的容量和填充率以及是否遵循插入顺序。

LinkedHashMap<K,V> lhm = new LinkedHashMap<K,V>(int capacity,float fillRatio,boolean Order);
这里,对于Order 属性,最后访问顺序传递 true,插入顺序传递 false。

LinkedHashMap 的方法 

方法

描述

containsValue​(Object value)如果此映射将一个或多个键映射到指定值,则返回 true。
entrySet()返回此映射中包含的映射的集合视图。
get​(Object key)返回指定键映射到的值,如果此映射不包含该键的映射,则返回 null。
keySet()返回此映射中包含的键的 Set 视图。
removeEldestEntry​(Map.Entry<K,​V> eldest)如果此映射应删除其最旧的条目,则返回 true。
values()返回此映射中包含的值的 Collection 视图。

应用:由于 LinkedHashMap 使用双向链接列表来维护插入顺序,我们可以通过重写removeEldestEntry()方法来实现 LRU 缓存功能,以实施在将新映射添加到映射时自动删除过时映射的策略。这允许您使用您定义的一些标准使数据过期。

例子:

// Java Program to Demonstrate Working of LinkedHashMap

// Importing required classes
import java.util.*;

// LinkedHashMapExample
public class GFG {

    // Main driver method
    public static void main(String a[])
    {

        // Creating an empty LinkedHashMap
        LinkedHashMap<String, String> lhm
            = new LinkedHashMap<String, String>();

        // Adding entries in Map
        // using put() method
        lhm.put("one", "practice.geeksforgeeks.org");
        lhm.put("two", "code.geeksforgeeks.org");
        lhm.put("four", "www.geeksforgeeks.org");

        // Printing all entries inside Map
        System.out.println(lhm);

        // Note: It prints the elements in same order
        // as they were inserted

        // Getting and printing value for a specific key
        System.out.println("Getting value for key 'one': "
                           + lhm.get("one"));

        // Getting size of Map using size() method
        System.out.println("Size of the map: "
                           + lhm.size());

        // Checking whether Map is empty or not
        System.out.println("Is map empty? "
                           + lhm.isEmpty());

        // Using containsKey() method to check for a key
        System.out.println("Contains key 'two'? "
                           + lhm.containsKey("two"));

        // Using containsKey() method to check for a value
        System.out.println(
            "Contains value 'practice.geeks"
            + "forgeeks.org'? "
            + lhm.containsValue("practice"
                                + ".geeksforgeeks.org"));

        // Removing entry using remove() method
        System.out.println("delete element 'one': "
                           + lhm.remove("one"));

        // Printing mappings to the console
        System.out.println("Mappings of LinkedHashMap : "
                           + lhm);
    }
}

输出
{one=practice.geeksforgeeks.org, two=code.geeksforgeeks.org, four=www.geeksforgeeks.org}
Getting value for key 'one': practice.geeksforgeeks.org
Size of the map: 3
Is map empty? false
Contains key 'tw...

LinkedHashMap类上的各种操作
        我们来看看如何对LinkedHashMap类实例执行一些常用的操作。

操作 1:添加元素
        为了向 LinkedHashMap 添加元素,我们可以使用 put() 方法。这与 HashMap 不同,因为在HashMap中,插入顺序不会被保留,但在 LinkedHashMap 中会保留。 

例子:

// Java Program to Demonstrate Adding
// Elements to a LinkedHashMap

// Importing required classes
import java.util.*;

// Main class
// AddElementsToLinkedHashMap
class GFG {

    // Main driver method
    public static void main(String args[])
    {

        // Initialization of a LinkedHashMap
        // using Generics
        LinkedHashMap<Integer, String> hm1
            = new LinkedHashMap<Integer, String>();

        // Add mappings to Map
        // using put() method
        hm1.put(3, "Geeks");
        hm1.put(2, "For");
        hm1.put(1, "Geeks");

        // Printing mappings to the console
        System.out.println("Mappings of LinkedHashMap : "
                           + hm1);
    }
}

输出
Mappings of LinkedHashMap:{3=Geeks, 2=For, 1=Geeks}


操作2:更改/更新元素
        添加元素后,如果我们希望更改元素,可以使用 put() 方法再次添加元素。由于 LinkedHashMap 中的元素是使用键进行索引的,因此只需重新插入我们希望更改的键的更新值即可更改键的值。

例子:

// Java Program to Demonstrate Updation of Elements
// of LinkedHashMap

import java.util.*;

// Main class
// UpdatingLinkedHashMap
class GFG {

    // Main driver method
    public static void main(String args[])
    {

        // Initialization of a LinkedHashMap
        // using Generics
        LinkedHashMap<Integer, String> hm
            = new LinkedHashMap<Integer, String>();

        // Inserting mappings into Map
        // using put() method
        hm.put(3, "Geeks");
        hm.put(2, "Geeks");
        hm.put(1, "Geeks");

        // Printing mappings to the console
        System.out.println("Initial map : " + hm);

        // Updating the value with key 2
        hm.put(2, "For");

        // Printing the updated Map
        System.out.println("Updated Map : " + hm);
    }
}

输出
Initial map : {3=Geeks, 2=Geeks, 1=Geeks}
Updated Map : {3=Geeks, 2=For, 1=Geeks}


操作3:删除元素
        为了从 LinkedHashMap 中删除一个元素,我们可以使用 remove() 方法。此方法将键的值作为输入,搜索此类键是否存在,然后从此 LinkedHashMap 中删除该键的映射(如果映射中存在)。除此之外,如果定义了最大大小,我们还可以从映射中删除第一个输入的元素。

例子:

// Java program to Demonstrate Removal of Elements
// from LinkedHashMap

// Importing utility classes
import java.util.*;

// Main class
// RemovingMappingsFromLinkedHashMap
class GFG {

    // Main driver method
    public static void main(String args[])
    {
        // Initialization of a LinkedHashMap
        // using Generics
        LinkedHashMap<Integer, String> hm
            = new LinkedHashMap<Integer, String>();

        // Inserting the Elements
        // using put() method
        hm.put(3, "Geeks");
        hm.put(2, "Geeks");
        hm.put(1, "Geeks");
        hm.put(4, "For");

        // Printing the mappings to the console
        System.out.println("Initial Map : " + hm);

        // Removing the mapping with Key 4
        hm.remove(4);

        // Printing the updated map
        System.out.println("Updated Map : " + hm);
    }
}

输出
Initial Map : {3=Geeks, 2=Geeks, 1=Geeks, 4=For}
Updated Map : {3=Geeks, 2=Geeks, 1=Geeks}

操作4:遍历LinkedHashMap
        有多种方法可以遍历 LinkedHashMap。最著名的方法是使用for-each 循环遍历映射的集合视图(使用 map.entrySet() 实例方法获取)。然后对于每个条目(集合元素),可以使用 getKey() 和getValue()方法获取键和值的值。

例子:

// Java program to demonstrate
// Iterating over LinkedHashMap

// Importing required classes
import java.util.*;

// Main class
// IteratingOverLinkedHashMap
class GFG {

    // Main driver method
    public static void main(String args[])
    {

        // Initialization of a LinkedHashMap
        // using Generics
        LinkedHashMap<Integer, String> hm
            = new LinkedHashMap<Integer, String>();

        // Inserting elements into Map
        // using put() method
        hm.put(3, "Geeks");
        hm.put(2, "For");
        hm.put(1, "Geeks");

        // For-each loop for traversal over Map
        for (Map.Entry<Integer, String> mapElement :
             hm.entrySet()) {

            Integer key = mapElement.getKey();

            // Finding the value
            // using getValue() method
            String value = mapElement.getValue();

            // Printing the key-value pairs
            System.out.println(key + " : " + value);
        }
    }
}

输出
3 : Geeks
2 : For
1 : Geeks

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI知识点】批归一化(Batch Normalization)

批归一化&#xff08;Batch Normalization&#xff0c;BN&#xff09; 是一种用于加速神经网络训练并提高模型稳定性的方法&#xff0c;最早由 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出。批归一化通过在每一层对神经网络中的激活值进行标准化&#xff0c;使得每一层的…

半路出家:如何转行成为软件开发者——之找到一份工作

一、前言 一个半路出家的软件开发者&#xff0c;尽管只有短短几年软件开发的相关经验&#xff0c;却可以凭借他在其他领域积累的丰厚经验&#xff0c;最终一举超过单纯拥有更多软件开发经验的同行【有时拥有不同的专业背景&#xff08;甚至是与软件完全不搭界的行业&#xff09…

SpringBoot赋能旅游管理:系统设计与实现

第三章 系统分析 3.1可行性分析 对所有的系统来说&#xff0c;都有可能会受到时间和空间上的制约。所以&#xff0c;我们在设计每一个项目的时候&#xff0c;必须对该系统实行可行性分析&#xff0c;这样不但能够降低项目的危害&#xff0c;还能改降低人力、物力和财力的损耗。…

弱网(不限于 Wi-Fi)环境的传输优化分析

参见 Wi-Fi弱网传输优化不成功有感 早在几年前还做传输优化时&#xff0c;我就非常不赞同在弱网环境激进传输的优化策略&#xff0c;我一直觉得这是在劣化传输&#xff0c;这观点一直影响着我&#xff0c;我也屡次因为这个与经理发生冲突。这观点如下表述&#xff1a; 弱网环…

【SpringSecurity】基本流程

【中文文档: Spring Security 中文文档 :: Spring Security Reference】 【英文文档&#xff1a;Spring Security】 以下内容只是记录springsecurity最简单的一种验证流程&#xff0c;所有配置基本都是默认的配置。 引入依赖 <dependency><groupId>org.springf…

GPU Puzzles讲解(一)

GPU-Puzzles项目可以让你学习到GPU编程和cuda核心并行编程的概念&#xff0c;通过一个个小问题让你理解cuda的编程和调用&#xff0c;创建共享显存空间&#xff0c;实现卷积和矩阵乘法等&#xff0c;通过每个小问题之后还会奖励一个狗狗小视频&#x1f601; 下面是项目的仓库&…

大模型面试宝典:问题全集及权威解答

导读 自ChatGPT开启大模型时代以来&#xff0c;大模型正迎来飞速发展&#xff0c;现在从事大模型开发相关工作可谓是处在时代的风口。那么大模型面试需要哪些技能和技巧呢&#xff0c;本文详细整理了全套的面试问题及答案&#xff0c;希望对大家有所帮助&#xff01; 目录 [x…

脉冲神经网络(SNN)论文阅读(六)-----ECCV-2024 脉冲驱动的SNN目标检测框架:SpikeYOLO

原文链接&#xff1a;CSDN-脉冲神经网络&#xff08;SNN&#xff09;论文阅读&#xff08;六&#xff09;-----ECCV-2024 脉冲驱动的SNN目标检测框架&#xff1a;SpikeYOLO Integer-Valued Training and Spike-Driven Inference Spiking Neural Network for High-performance …

MySQL数据库专栏(二)SQL语句基础操作

目录 数据库操作 创建数据库 查看数据库 选择数据库 删除数据库 数据表操作 数据表数据类型 数据表列约束 数据表索引 创建表 查看表 查看表结构 删除表 数据表的增删改操作 …

自由学习记录

约束的泛型通配符? Java中的泛型 xiaomi和byd都继承了car&#xff0c;但是只是这两个类是car的子类而已&#xff0c;而arraylist<xiaomi> ,arraylist<byd> 两个没有半毛钱继承关系 所以传入的参数整体&#xff0c;是car的list变形&#xff0c;里面的确都能存car…

YOLO11改进 | 卷积模块 | 添加选择性内核SKConv【附完整代码一键运行】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在标准卷积神经网络 (CNN) 中&#xff0…

单调栈day54|42. 接雨水(高频面试题)、84. 柱状图中最大的矩形、两道题思维导图的汇总与对比

单调栈day54|42. 接雨水&#xff08;高频面试题&#xff09;、84. 柱状图中最大的矩形、两道题思维导图的汇总与对比 42. 接雨水84. 柱状图中最大的矩形两道题思维导图的汇总与对比 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱…

2025,企业管理平台的理想模型V0.1

1.前言 近期出于综合考虑&#xff0c;准备休息一段时间......... 在这段时间里&#xff0c;准备重新梳理下企业管理平台应该具备的能力.并准备使用开源项目来一次组合式组装&#xff0c;最终形成一个初步可行的运行平台。 2.企业管理平台的主要组成 企业管理平台不是独立存…

《python语言程序设计》2018版第8章20题使用Rational类编写一个程序(上)-修改一下8-4Rational类我认为的错误

首先抄一下Rational类,可以安静的抄一遍 一、抄写中的问号 各种报错的截图1各种报错的截图2各种报错的截图3各种报错的截图4添加一个str我将n和d修改为self 书中214-215页间程序清单8-4的代码如下: class Rational:def __init__(self, numerator1, denominator0):divisor gcd(…

产品经理内容分享(二):AI产品经理的入门路线图

引言 想象这样一个场景&#xff1a;早晨的阳光穿透窗帘&#xff0c;投射在新一代智能机器人上&#xff0c;它正静静等待着你的第一个命令开始全新的一天。这样的场景听起来像是科幻小说里的情节&#xff0c;但实际上&#xff0c;这正是AI产品经理们工作的成果。如果你对这样的…

使用axios封装AJAX

一 、Http 请求报文 包括了三部分: 求情行、请求头,请求体。 1、请求行: 是HTTP请求的第一行,包含了请求方法、请求目标和HTTP协议版本。常用的请求方法有GET、POST、PUT、DELETE等,用于指定客户端希望服务器执行的操作。请求目标是指请求的资源路径,可以是一个具体的…

国外电商系统开发-运维系统资产属性-命令执行功能

当前开发中&#xff0c;还不支持点击拓扑图标打开资产的功能&#xff0c;后期有时间补全对应的开发。 该功能如同Xshell、SecureCRT、Putty一样&#xff0c;可以批量的发送系统命令&#xff0c;让Linux服务器执行。 默认情况下&#xff0c;系统已经选择全部主机&#xff0c;如果…

番外篇 | CRAS-YOLO:基于卫星图像的多类别船舶检测和分类

前言:Hello大家好,我是小哥谈。目前,基于卫星图像的多类别船舶检测和分类由于在军事和民用领域的重要应用而备受关注。针对传统检测效果不佳的情形,我们进一步提出了一种新的多类船检测,称为CRAS-YOLO,它由卷积块注意力模块(CBAM)、感受野块(RFB)和基于YOLOv5s的自适…

2024计算机毕业设计最简单的完成流程

一、计算机专业毕业设计选题-选题推荐 1.基于深度学习的生活垃圾智能分类系统&#xff08;微信小程序YOLOv5训练数据集开题报告中期检查论文&#xff09; &#xff08;1&#xff09;程序界面 &#xff08;2&#xff09;论文大纲 &#xff08;3&#xff09;论文详情链接 基于…

【高等代数笔记】线性空间(十九-二十四上半部分)

课程视频剪辑得太抽象了&#xff0c;一节课不能完整学完&#xff0c;拆的零零散散得。 3. 线性空间 3.19 满秩矩阵 【推论4】设 rank ( A ) r \text{rank}(\boldsymbol{A})r rank(A)r&#xff0c;则 A \boldsymbol{A} A的不为0的 r r r阶子式所在的列&#xff08;行&#x…