学习笔记22 map

news2025/1/12 15:49:52

一、概论

map的每个元素都由两个部分组成:键和值。每个键都与一个特定的值相关联,并且可以用于定位该值。

map和set很像,只不过map存储的是key,由key再映射到value,而set存储的就是value本身。

Map接口是泛型的,由两个类型变量K和V进行参数化。它们分别代表表示键和值对象的类型。

map接口:

 特别的,对于Set< Map.Entry<K,V> > entrySet()

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);

Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

Key = apple, Value = 1
Key = banana, Value = 2
Key = orange, Value = 3

这个方法返回一个set,set中的元素是map中的每个键值对 。

为什么非要用这个方法才能得到键值对?为什么不能直接对map集合用get方法?因为对map集合直接用get方法是通过键返回值。

二、HashMap Class

1.构造器

 2.几种常用的方法

我们用一个例子来过一遍HashMap常用的方法

import java.util.*;

public class CarHashMap1 {
    public static void main(String[] args) {
        // 创建一个HashMap来存储Car对象
        Map<String, Car> carMap = new HashMap<>();

        // 创建一些Car对象
        Car vw = new Car("227H54", "1997 Volkswagen");
        Car mustang = new Car("448A69", "1965 Mustang");
        Car porsche = new Car("453B55", "2007 Porsche");
        Car bmw = new Car("177R60", "1980 BMW");

        // 将一些映射关系添加到HashMap中。在每个映射关系中,车辆的VIN是键,包含该VIN的Car对象是值。
        carMap.put(vw.getVin(), vw);
        carMap.put(mustang.getVin(), mustang);
        carMap.put(porsche.getVin(), porsche);
        carMap.put(bmw.getVin(), bmw);

        // 按VIN搜索Mustang
        System.out.println("\nSearching for the car with VIN " + mustang.getVin());
        Car foundCar = carMap.get(mustang.getVin());

        // 如果找到了车辆,则显示它。
        if (foundCar != null)
            System.out.println(foundCar);
        else
            System.out.println("The Mustang is NOT in the set.");

        // 搜索另一个VIN。这个VIN不在集合中。
        System.out.println("\nSearching for the car with VIN 911C87");
        foundCar = carMap.get("911C87");

        // 如果找到了车辆,则显示它。
        if (foundCar != null)
            System.out.println(foundCar);
        else
            System.out.println("That car is NOT in the set.");
    }
}

Searching for the car with VIN 448A69

VIN: 448A69 Description: 1965 Mustang

Searching for the car with VIN 911C87

That car is NOT in the set.

构造一个hashmap:

Map<String, Car> carMap = new HashMap<>();

Note that the Map interface has been specialized to Map because String is the data type of the keys and Car is the data type of the values  

 向hashmap中添加键值对:

carMap.put(vw.getVin(), vw);

在hashmap中找键对应的值:

Car foundCar = carMap.get(mustang.getVin());

3.遍历hashmap

与Set<E>和List<E>接口不同,Map<K, V>接口没有扩展Collection<E>接口。而且,与其他集合类型不同,Map并不提供迭代器。如果要遍历Map,我们需要将其映射关系转换为其他collection。

例如,可以使用keySet()方法获取一个包含Map中所有键的Set Collection,也可以使用values()方法获取一个包含Map中所有值的Collection。然后可以对得到的Set或Collection进行迭代。

import java.util.*;

public class CarHashMap2 {
    public static void main(String[] args) {
        // 创建一个HashMap来存储Car对象
        Map<String, Car> carMap = new HashMap<>();

        // 创建一些Car对象
        Car vw = new Car("227H54", "1997 Volkswagen");
        Car mustang = new Car("448A69", "1965 Mustang");
        Car porsche = new Car("453B55", "2007 Porsche");
        Car bmw = new Car("177R60", "1980 BMW");

        // 将一些映射关系添加到HashMap中。在每个映射关系中,车辆的VIN是键,包含该VIN的Car对象是值。
        carMap.put(vw.getVin(), vw);
        carMap.put(mustang.getVin(), mustang);
        carMap.put(porsche.getVin(), porsche);
        carMap.put(bmw.getVin(), bmw);

        // 获取一个包含Map中所有键的Set集合。
        Set<String> keys = carMap.keySet();

        // 遍历所有键,打印每个键。
        System.out.println("Here are the keys:");
        for (String k : keys)
            System.out.println(k);

        // 获取一个包含Map中所有值的Collection集合。
        Collection<Car> values = carMap.values();

        // 遍历所有值,打印每个值。
        System.out.println("\nHere are the values:");
        for (Car c : values)
            System.out.println(c);
    }
}

Here are the keys:

177R60

227H54

448A69

453B55

Here are the values:

VIN: 177R60 Description: 1980 BMW

VIN: 227H54 Description: 1997 Volkswagen

VIN: 448A69 Description: 1965 Mustang

VIN: 453B55 Description: 2007 Porsche

从keySet()和values()方法返回的Set和Collection都作为对Map的“视图”。集合和集合中的元素仅仅是对Map中实际条目的引用因此在集合或集合中对元素所做的任何更改都会反映使用这种方法得到的Map中,反之亦然。换句话说,如果更改了Map中的条目,那么在Set和Collection中引用该条目的元素也会相应地更改。 

这里我们返回了两个set,反别存储key和value,当然我们也可以用一个set存放整个键值对,这里我们需要用到entrySet method

import java.util.*;

public class CarHashMap3 {
    public static void main(String[] args) {
        // 创建一个HashMap来存储Car对象
        Map<String, Car> carMap = new HashMap<>();

        // 创建一些Car对象
        Car vw = new Car("227H54", "1997 Volkswagen");
        Car mustang = new Car("448A69", "1965 Mustang");
        Car porsche = new Car("453B55", "2007 Porsche");
        Car bmw = new Car("177R60", "1980 BMW");

        // 将一些映射关系添加到HashMap中。在每个映射关系中,车辆的VIN是键,包含该VIN的Car对象是值。
        carMap.put(vw.getVin(), vw);
        carMap.put(mustang.getVin(), mustang);
        carMap.put(porsche.getVin(), porsche);
        carMap.put(bmw.getVin(), bmw);

        // 获取一个包含Map中所有映射关系的Set<Map.Entry<String, Car>>。
        Set<Map.Entry<String, Car>> cars = carMap.entrySet();

        // 遍历所有映射关系,输出每个映射关系的键和值。
        System.out.println("Here are the mappings:");
        for (Map.Entry<String, Car> entry : cars) {
            System.out.println("Key =" + entry.getKey());
            System.out.println("Value =" + entry.getValue());
            System.out.println();
        }
    }
}
Here are the mappings:
Key = 177R60
Value = VIN: 177R60 Description: 1980 BMW
Key = 227H54
Value = VIN: 227H54 Description: 1997 Volkswagen
Key = 448A69
Value = VIN: 448A69 Description: 1965 Mustang
Key = 453B55
Value = VIN: 453B55 Description: 2007 Porsche

 

The getKey method returns the key and getValue returns the value.
在java8之后,对于map,我们也有对应的forEach方法:
void forEach(BiConsumer<? super K,? super V> action)

这个操作必须实现BiConsumer<? super K,? super V>接口。这意味着操作函数必须具有与类型 (K, V) → void 相关的类型;它的参数是一个键和一个值,其返回类型为void。

使用这个方法,我们可以对上面的例子做出如下修改:

System.out.println("Here are the mappings:");
carMap.forEach( (key, value) −>
 {
 System.out.println("Key = " + key);
 System.out.println("Value = " + value);
 System.out.println();
 });

三、LinkedHashMap Class

LinkedHashMap类是HashMap的子类,它允许按照以下两种顺序访问其中的映射关系:
- 插入顺序:按照映射关系插入到Map中的顺序进行访问。
- 访问顺序:按照映射关系最近一次被访问的时间进行访问。

LinkedHashMap通过内部的链表引用映射关系。如果在插入顺序模式下使用该Map,则链表按照插入顺序引用映射关系。如果在访问顺序模式下使用该Map,则链表按照使用put或get方法访问映射关系的顺序进行引用。

在访问顺序模式下,最常访问的映射关系位于链表的末尾,最少访问的映射关系位于链表的开头。这种模式在需要知道哪些数据项被最多或最少访问的应用程序中非常有用。

四、TreeMap Class 

我们使用TreeMap类来创建一个按键排序的Map。

SortedMap接口中定义了一些与排序相关的方法,例如:按键排序的方法(keySet()、subMap()、headMap()和tailMap()),以及按照键所在的顺序返回映射关系的方法(firstKey()、lastKey()等)等。TreeMap类可以使用这些方法来按照键排序存储映射关系。当然,为了使TreeMap可以按照键进行排序,TreeMap要求其键必须是可比较的(即,实现了Comparable接口或传入了一个Comparator对象)。

 

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

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

相关文章

拦截Bean使用之前各个时机的Spring组件

拦截Bean使用之前各个时机的Spring组件 之前使用过的BeanPostProcessor就是在Bean实例化之后&#xff0c;注入属性值之前的时机。 Spring Bean的生命周期本次演示的是在Bean实例化之前的时机&#xff0c;使用BeanFactoryPostProcessor进行验证&#xff0c;以及在加载Bean之前进…

flink to starrocks 问题集锦....

[问题排查]导入失败相关 - 问题排查 - StarRocks中文社区论坛 starrocks官网如下&#xff1a; Search StarRocks Docs starrocks内存配置项&#xff1a; 管理内存 Memory_management StarRocks Docs 问题1&#xff1a;实时写入starrocks &#xff0c;配置参数设置如下&a…

【【51单片机11.0592晶振红外遥控】】

51单片机11.0592晶振红外遥控 红外遥控&#xff0c;51单片机完结 这是初步实现的架构 怎么实现内部的详细逻辑 我们用状态机的方法 0状态时一个空闲状态 当它接收到下降沿开始计时然后转为1状态 1状态下 寻找start 或者repeat的信号 再来下降沿读出定时器的值 如果是start 那…

华为eNSP:isis的配置

一、拓扑图 二、路由器的配置 配置接口IP AR1&#xff1a; <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthe…

【沁恒蓝牙mesh】数据收发接口与应用层模型传递

本文主要描述了沁恒蓝牙mesh SDK的蓝牙数据收发接口&#xff0c;以及应用层的回调函数解析以及模型传递 这里写目录标题 1. 数据收发接口1.1【发送数据】1.2 【数据接收】 2. 应用层模型分析 1. 数据收发接口 1.1【发送数据】 /*&#xff08;1&#xff09;接口1 */ /*接口一&…

力扣热门100题之最大子数组和【中等】【动态规划】

题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&a…

Java文字转语音功能实现

需要下载jacob-1.18&#xff0c;网上一堆 项目中引入pom文件 <!-- https://mvnrepository.com/artifact/com.jacob/jacob 文字转语音 --> <dependency><groupId>com.hynnet</groupId><artifactId>jacob</artifactId><version>1.18&…

Go语言中‘String’包中的‘Cut‘函数的实现

Go语言中‘String’包中的’Cut’函数的实现 ​ Cut函数用于在字符串**‘s’中查找子串’sep’&#xff0c;并将字符串’s’在子串 ‘sep’ 第一次出现的位置分割成两部分&#xff1a;before和after** package main import("fmt" "strings" ) func main(…

Python初学

认识计算机&#xff1a; 计算机是怎么构成的——冯诺依曼体系结构 内存外存的区别&#xff1a; 一般机械硬盘的存储数据的期限是&#xff1a;几年到十几年 什么是编程&#xff1f; 制作软件——编程/软件开发 编程语言有哪些&#xff1f; Python Python背景知识 荷兰人Guid…

M5ATOMS3基础02传感器MPU6886

M5ATOMS3基础01按键 简洁版本 MPU6886是一款6轴IMU单元&#xff0c;具有3轴重力加速度计和3轴陀螺仪。它采用16位ADC&#xff0c;内置可编程数字滤波器和片上温度传感器&#xff0c;并通过I2C接口&#xff08;地址为0x68&#xff09;与上位机通信。MPU6886支持低功耗模式&#…

Linux系统MySQL中用户的权限管理

本节主要学习用户权限管理的概述&#xff0c;用户权限类型&#xff0c;用户赋权&#xff0c;权限删除&#xff0c;用户删除等。 目录 一、概述 二、用户权限类型 三、用户赋权 四、权限删除 五、用户删除 一、概述 数据库用户权限管理是数据库系统中非常重要的一个方面&am…

如何理解 SpringBoot 的生命周期

生命周期&#xff0c;就是从诞生到死亡的一个过程。Spring 中 bean 也是如此。在 Spring 中的 ConfigurableApplicationContext 的 refresh 开始直到一个 bean 可以被正常使用&#xff0c;中间经历了一系列初始化操作&#xff1b;而在其 close 后又经历了一系列销毁操作&#x…

(八九)如何与InfluxDB交互InfluxDB HTTP API

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 8 章 前言&#xff1a;如何与InfluxDB交互 1、InfluxDB启动后&#xff0c;会向外提供一套HTTP API。外部程…

配置代理——解决跨域问题(详解)

之前写项目的时候总会遇到配置代理的问题&#xff0c;可是配置了之后有时有用&#xff0c;有时就没有用&#xff0c;自己之前学的也是懵懵懂懂&#xff0c;于是专门花了一个小时去了解了如何配置代理跨域&#xff0c;然后在此记录一下&#xff0c;方便自己以后查阅。 一、 常用…

自守数 C语言实现

自守数 描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff1a;25^2 625&#xff0c;76^2 5776&#xff0c;9376^2 87909376。请求出n(包括n)以内的自守数的个数 数据范围&#xff1a; 1≤n≤10000 输入描述&#xff1a; int型整数 输出描述&#xf…

重学C++系列之多态

一、什么是多态 多态是类的三大特性之一&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;。多态是指由继承而产生的相关不同的类&#xff0c;其派生类对象对同一个消息会作出不同响应。 二、引入多态的目的 能增加程序的灵活性&#xff0c;可以减轻系统升级和维…

EC200U-CN学习(三)

EC200U系列内置丰富的网络协议&#xff0c;集成多个工业标准接口&#xff0c;并支持多种驱动和软件功能&#xff08;适用于Windows 7/8/8.1/10、Linux和Android等操作系统下的USB驱动&#xff09;&#xff0c;极大地拓展了其在M2M领域的应用范围&#xff0c;如POS、POC、ETC、共…

TCP协议如何实现可靠传输

TCP最主要的特点 TCP是面向连接的运输层协议&#xff0c;在无连接的、不可靠的IP网络服务基础之上提供可靠交付的服务。为此&#xff0c;在IP的数据报服务基础之上&#xff0c;增加了保证可靠性的一系列措施。 TCP最主要的特点&#xff1a; TCP是面向连接的输出层协议 每一条…

vue3.2 + elementPlus + Windi CSS + ts创建一个好用的可兼容不同宽高的login页面

1.效果预览 2. 代码准备 导入windiCSS&#xff1a; npm i -D vite-plugin-windicss windicss windiCSS官网&#xff1a; https://cn.windicss.org/integrations/vite.html 使用vite创建好你的vue工程 sass版本为&#xff1a; 1.49.9 3.Windi CSS在页面中使用 apply 二次定义类名…

ACwing 1081. 度的数量

文章目录 题意思路代码 题意 给你一段区间[x, y]求其中满足一个数恰好等于K个互不相等的B的整数次幂之和的数的个数。 例如&#xff1a;x 15, y 20, k 2, b 2&#xff0c;那么对于这个区间有且仅有三个数满足题意&#xff1a; 17 2 4 2 0 10001 17 2^42^0 10001 1724…