Java 中的 LinkedHashMap

让我们从一个简单的 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.mzph.cn/diannao/55661.shtml

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

相关文章

django的路由分发

前言&#xff1a; 在前面我们已经学习了基础的Django了&#xff0c;今天我们将继续学习&#xff0c;我们今天学习的是路由分发&#xff1a; 路由分发是Web框架中的一个核心概念&#xff0c;它指的是将不同的URL请求映射到对应的处理函数&#xff08;视图&#xff09;的过程。…

Ambari搭建Hadoop集群 — — 问题总结

Ambari搭建Hadoop集群 — — 问题总结 一、部署教程&#xff1a; 参考链接&#xff1a;基于Ambari搭建大数据分析平台-CSDN博客 二、问题总结&#xff1a; 1. VMwear Workstation 查看网关 2. 资源分配 参考&#xff1a; 硬盘&#xff1a;master&#xff08;29 GB&#xff…

手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]

有时候&#xff0c;您会被锁定在自己的 Android 设备之外&#xff0c;而且似乎不可能重新进入。 一个例子就是你买了一部二手手机&#xff0c;后来发现无法使用。另一种情况是你忘记了屏幕锁定密码和用于验证密码的 Google 帐户凭据。这种情况很少见&#xff0c;但确实会发生&…

15分钟学 Python 第35天 :Python 爬虫入门(一)

Day 35 : Python 爬虫简介 1.1 什么是爬虫&#xff1f; 网页爬虫&#xff08;Web Crawler&#xff09;是自动访问互联网并提取所需信息的程序。爬虫的主要功能是模拟用户通过浏览器访问网页的操作&#xff0c;从而实现对网页内容的批量访问与信息提取。它们广泛应用于数据收集…

RTEMS面试题汇总及参考答案

目录 RTEMS是什么?它在嵌入式系统中扮演什么角色? RTEMS的全称是什么? RTEMS的主要特点有哪些? RTEMS支持哪些处理器架构? RTEMS的可剥夺型内核和不可剥夺型内核有何不同? RTEMS 的微内核设计及其优势 RTEMS 如何实现多任务处理和调度 RTEMS 的任务调度策略有哪…

Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出

各个操作功能 部分功能 几种操作游戏物体的方式&#xff1a; Center:有游戏物体父子关系的时候&#xff0c;中心点位置 Global/Local:世界坐标系方向/自身坐标系方向 &#xff1a;调试/暂停/下一帧 快捷键 1.Alt鼠标左键&#xff1a;可以实现巡游角度查看场景 2.鼠标滚轮…

MySQL从0到1基础语法笔记(上)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 MySQL笔记&#xff1a; 一、注释&#xff1a; 二、SQL四大类&#xff…

leetcode 刷题day36动态规划Part05 背包问题(完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶))

完全背包 完全背包的每件商品都有无限个&#xff0c;和01背包的一不同主要体现在遍历顺序上。为了保证每个物品仅被添加一次&#xff0c;01背包内嵌的循环是从大到小遍历。而完全背包的物品是可以添加多次的&#xff0c;所以要从小到大去遍历。 518. 零钱兑换 II 思路&#…

、并发请求

初始化 const axios require(axios) const apis [url1, url2, url3] // 模拟 http apis并发函数 /*** param {Array<string>} apis* param {number} maxNum 最大并发量* returns {Promise}*//*** param {Array<string>} apis 请求的API集* param {number} maxN…

在线测径仪都有哪些别称?

在线测径仪广泛运用于电线电缆、输送管、金属丝、PVC管、医疗器械、塑料、金属拉丝、橡胶、高线、圆钢、钢筋、螺纹钢、钢管、轧钢等生产行业&#xff0c;主要用于这些行业生产出的产品的直径、椭圆度&#xff08;双轴及以上测头&#xff09;等的检测。 测径仪为在线检测设备&a…

等保测评中的关键技术应用:防火墙与入侵检测系统

在当今数字化时代&#xff0c;网络安全已成为企业运营不可或缺的一部分。等级保护&#xff08;简称“等保”&#xff09;制度作为中国网络安全领域的一项重要法规&#xff0c;旨在通过不同等级的安全保护要求&#xff0c;确保信息系统免受各类威胁和破坏&#xff0c;保障信息的…

【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具

选择最适合你的.NET UI框架&#xff1a;全面解析六种热门选择 前言 在现代软件开发中&#xff0c;选择合适的桌面应用框架和UI库对于开发人员来说至关重要。本文将介绍几种流行的.NET桌面应用框架和UI库&#xff0c;包括Eto.Forms、Avalonia、ReactiveUI、MahApps.Metro、Mat…

智能指针详解

目录 智能指针原理 RAII Unique_ptr Shared_ptr Shared_ptr缺点 定制删除器 在C库里提供的智能指针有跟多&#xff0c;如下图所示&#xff0c;使用时需要包含头文件<memory>。下面将详细介绍这些智能指针的底层原理和缺点&#xff0c;还有每个智能指针的应用场景。…

AI寒冬?不,2025年将是AI代理之年

引言 近年来,人工智能(AI)的发展速度令人瞩目,但一些观察者认为今年的前六个月相对“缓慢和无趣”。然而,这种观点可能忽略了AI在多个领域的持续进步。本文将探讨为什么我们不应该轻易使用“AI寒冬”这样的说法,并展望2025年作为AI代理之年的潜力。 为何不应轻易使用“…

Linux No space left on device分析和解决

报错解释&#xff1a; "No space left on device" 错误表示你的Linux设备&#xff08;通常是磁盘分区&#xff09;上没有剩余空间了。这可能是因为磁盘已满&#xff0c;或者inode已满。磁盘空间是指磁盘上的实际空间&#xff0c;而inode是用来存储文件元数据的数据结…

嘉立创EDA中PCB快速画螺旋触摸焊盘或其他不规则形状

常见触摸焊盘 首先需要有CAD软件 使用CAD的原因&#xff1a;能快速编辑线条和不规则形状&#xff0c;在嘉立创EDA中不能快速完成。 画图整体步骤&#xff1a; 1&#xff0c;先在CAD中画出螺旋线&#xff08;HELIX&#xff09; 这里需要设置底部半径&#xff0c;圈数和顶部半…

【MYSQL】mysql约束---自增长约束(auto_increment)

1、概念 在Mysql中&#xff0c;当主键为自增长后&#xff0c;这个主键的值就不再需要用户输入数据了&#xff0c;而由数据库系统根据定义自动赋值。每增加一条记录&#xff0c;主键会自动以相同的步长进行增长。 注意&#xff1a;自增长约束通常与主键放在一起使用。 通过给…

网盘能否作为FTP替代产品?企业该如何进行FTP国产化替代?

近年来&#xff0c;信创的概念引入和高效实践落地让更多的行业企业自发性地进行国产化替代&#xff0c;目前信创国产化替代还多发生在操作系统和应用层面&#xff0c;软件工具等目前还在下一阶段规划&#xff0c;但很多企业未雨绸缪&#xff0c;已经在做调研和尝试。 FTP作为世…

守护网络安全:从日常生活做起的防护策略

引言 在信息化时代&#xff0c;网络已成为我们生活中不可或缺的一部分。它为我们提供了快速沟通和便捷服务的渠道&#xff0c;使我们能够高效地办理业务、完成工作和享受娱乐。然而&#xff0c;随着网络的普及和信息化程度的加深&#xff0c;我们在享受便利的同时&#xff0c;…