Java中的Map(如果想知道Java中有关Map的知识点,那么只看这一篇就足够了!)

news2025/1/24 2:14:29

        前言:在Java编程语言中,集合框架(Collection Framework)提供了一系列用于存储和操作数据的接口和类。其中,Map和Set是两个非常重要的接口,分别用于存储键值对和无重复元素的集合。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

先让我们看一下本文大致的讲解内容:

目录

1.Map概念简介

        (1)Map的定义

        (2)Map.Entry的说明,>

        (3)Map类在Java集合类中的关系

2.Map接口中常用API

3.Map的常见实现类

        (1)HashMap

        (2)LinkedHashMap

        (3)TreeMap

4.Map的实际案例

5.总结


1.Map概念简介

        (1)Map的定义

        在开始学习如何使用Java中的Map类之前,先让我们了解一下什么是Java中的Map类:

         ——Map类是Java集合框架中的一部分,用于存储键值对(key-value pairs)。每个键(key)对应一个值(value),键是唯一的,但值可以重复。常见的Map实现类包括HashMap、LinkedHashMapTreeMap。

        这里我们也附上官方文档中对Map的解释:Map (Java Platform SE 8 )

        我相信读者如果初次学习Java中的Map类的话,可能对上面对Java中Map类的解释不能很好的理解,不过没有关系,读者继续向下阅读即可。

        (2)Map.Entry<K, V>的说明

        对于Map这种数据结构而言,其底层可以简单的理解为是由一个个节点进行构成的的树,而Map.Entry<K, V>就是其每一个节点。

        对于Map.Entry<K, V>来说,其是Map内部实现的用来存放<key, value>键值对映射关系的内部类,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式:

方法解释
K getKey()返回 entry 中的 key
V getValue()返回 entry 中的 value
V setValue(V value)将键值对中的value替换为指定value

        (3)Map类在Java集合类中的关系

        了解了Map的定义与Map.Entry<K, V>之后,在让我们看看Map在Java集合类中的关系,如下图:

从图中我们可以看出,Map类不在实现Collection接口,而是实现Map自身接口。

        ——通关上边的学习了解之后,这样我们就大致的了解了Java中的Map究竟是什么东西了。

2.Map接口中常用API

        Map接口提供了一些基本的方法,用于操作键值对。以下是Map接口的主要方法:

方法解释
V get(Object key)返回 key 对应的 value
V getOrDefault(Object key, V defaultValue)返回 key 对应的 value,key 不存在,返回默认值
V put(K key, V value)设置 key 对应的 value
V remove(Object key)删除 key 对应的映射关系
Set<K> keySet()返回所有 key 的不重复集合
Collection<V> values()返回所有 value 的可重复集合
Set<Map.Entry<K, V>> entrySet()返回所有的 key-value 映射关系
boolean containsKey(Object key)判断是否包含 key
boolean containsValue(Object value)判断是否包含 value

这里我们对上述方法进行逐一使用代码进行解释:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Collection;

public class MapMethodsExample {
    public static void main(String[] args) {
        // 创建一个 HashMap 实例
        Map<String, Integer> map = new HashMap<>();
        
        // V put(K key, V value): 设置 key 对应的 value
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("orange", 3);
        
        // V get(Object key): 返回 key 对应的 value
        Integer appleValue = map.get("apple");
        System.out.println("Value for 'apple': " + appleValue);
        
        // V getOrDefault(Object key, V defaultValue): 返回 key 对应的 value,key 不存在,返回默认值
        Integer mangoValue = map.getOrDefault("mango", 0);
        System.out.println("Value for 'mango': " + mangoValue);
        
        // V remove(Object key): 删除 key 对应的映射关系
        Integer removedValue = map.remove("banana");
        System.out.println("Removed value for 'banana': " + removedValue);
        System.out.println("Map after removing 'banana': " + map);
        
        // Set<K> keySet(): 返回所有 key 的不重复集合
        Set<String> keys = map.keySet();
        System.out.println("Keys: " + keys);
        
        // Collection<V> values(): 返回所有 value 的可重复集合
        Collection<Integer> values = map.values();
        System.out.println("Values: " + values);
        
        // Set<Map.Entry<K, V>> entrySet(): 返回所有的 key-value 映射关系
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        System.out.println("Entries: " + entries);
        
        // boolean containsKey(Object key): 判断是否包含 key
        boolean containsApple = map.containsKey("apple");
        System.out.println("Contains key 'apple': " + containsApple);
        
        // boolean containsValue(Object value): 判断是否包含 value
        boolean containsValue2 = map.containsValue(2);
        System.out.println("Contains value 2: " + containsValue2);
    }
}

        这样我们就大致的了解了Java中有关Map的API了!

3.Map的常见实现类

        在Java汇总,常见的Map实现类包括HashMapLinkedHashMapTreeMap。

        (1)HashMap

   HashMap是最常用的Map实现类,基于哈希表实现。它允许使用null键和null值,但不保证映射的顺序。其主要特点包括:

  • 线程不安全:多个线程同时访问时需要手动同步。
  • 无序:不保证键值对的插入顺序。
  • 高效:大多数操作的时间复杂度为O(1)。

以下为其代码演示:

import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> hashMap = new HashMap<>();

        // 添加键值对
        hashMap.put("Apple", 10);
        hashMap.put("Banana", 20);
        hashMap.put("Orange", 30);
        hashMap.put("Apple", 40); // 重复键将覆盖之前的值

        // 获取值
        int value = hashMap.get("Apple");
        System.out.println("Value for 'Apple': " + value);

        // 判断是否包含键
        boolean containsKey = hashMap.containsKey("Banana");
        System.out.println("Contains key 'Banana': " + containsKey);

        // 判断是否包含值
        boolean containsValue = hashMap.containsValue(20);
        System.out.println("Contains value 20: " + containsValue);

        // 遍历键值对
        for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

        // 删除键值对
        hashMap.remove("Orange");

        // 清空映射
        hashMap.clear();

        // 判断是否为空
        boolean isEmpty = hashMap.isEmpty();
        System.out.println("Is empty: " + isEmpty);
    }
}

        (2)LinkedHashMap

    LinkedHashMap继承自HashMap,并且在内部使用双向链表维护键值对的插入顺序。因此LinkedHashMap是有序的Map实现类。其主要特点包括:

  • 维护插入顺序或访问顺序。
  • 其他特性与HashMap相同。

以下为其代码演示:

import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> linkedHashMap = new LinkedHashMap<>();

        // 添加键值对
        linkedHashMap.put("Apple", 10);
        linkedHashMap.put("Banana", 20);
        linkedHashMap.put("Orange", 30);
        linkedHashMap.put("Apple", 40); // 重复键将覆盖之前的值

        // 遍历键值对
        for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

        (3)TreeMap

    TreeMap是基于红黑树实现的有序Map,它的键按照自然顺序或自定义比较器的顺序排序。其主要特点包括:

  • 保证键的排序顺序。
  • 其他特性与HashMap相似,但TreeMap的操作时间复杂度为O(log n)。

以下为其代码演示:

import java.util.Map;
import java.util.TreeMap;

public class TreeMapExample {
    public static void main(String[] args) {
        Map<String, Integer> treeMap = new TreeMap<>();

        // 添加键值对
        treeMap.put("Apple", 10);
        treeMap.put("Banana", 20);
        treeMap.put("Orange", 30);
        treeMap.put("Apple", 40); // 重复键将覆盖之前的值

        // 遍历键值对
        for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

这样我们就大致的了解了Map中常见实现类了!

4.Map的实际案例

        在学习完了Map概念简介、Map接口中常用API与Map的常见实现类之后,现在让我们看一下使用Map的实际案例来进一步加深对Java中Map类的理解:

        以下示例展示了如何使用Map统计一段文本中每个单词出现的频率:

import java.util.HashMap;
import java.util.Map;

public class WordFrequency {
    public static void main(String[] args) {
        String text = "This is a sample text. This text is for demonstration purposes.";

        // 统计单词频率
        Map<String, Integer> wordCount = new HashMap<>();
        String[] words = text.split("\\s+");

        for (String word : words) {
            word = word.toLowerCase().replaceAll("[^a-zA-Z]", "");
            if (!word.isEmpty()) {
                wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
            }
        }

        // 打印结果
        for (Map.Entry<String, Integer> entry : wordCount.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

        ——这样我们即完成了对一段文本中每个单词出现的次数的统计。

5.总结

        Map接口及其实现类在Java编程中扮演着重要角色。通过本文的介绍,相信读者能更好地理解Map的概念、常用方法及其在实际应用中的使用。HashMap提供了高效但无序的存储,LinkedHashMap维护插入顺序,TreeMap提供了有序存储。

        选择合适的Map实现类取决于具体需求,例如是否需要保证键的顺序或是否需要线程安全。


以上就是本篇文章的全部内容了!!!

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

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

相关文章

Nerd Fonts

文章目录 关于 Nerd Fonts重要告示TL;DR字体的各种下载选项 特点 Glyph Setsshell中的图标名称 修补字体Variations 字体安装Option 1: Release Archive DownloadOption 2: Homebrew FontsOption 3: Unofficial Chocolatey or Scoop RepositoriesOption 4: Arch Extra Reposito…

AI在医学领域:医学成像中针对深度神经网络(DNN)的对抗性攻击及其防御策略

关键词&#xff1a;对抗性攻击、医学图像、深度神经网络、模型安全、鲁棒性 机器学习&#xff08;ML&#xff09;是医学领域快速发展的一个分支&#xff0c;它利用计算机科学和统计学的方法来解决医学问题。众所周知&#xff0c;攻击者可能通过故意为机器学习分类器创建输入来…

C++11 包装器

1.function包装器 1.1 概念介绍 ret func(x); 上面 func 是什么呢&#xff1f;那么 func 可能是函数名&#xff0c;函数指针&#xff0c;函数对象 ( 仿函数对象 )&#xff0c; 也可能是lamber 表达式对象&#xff0c;这些都是可调用的类型。 函数包装器&#xff0c;也称为函…

comfyui老照片修复工作流,直接复制到comfyui中即可使用

ComfyUI是一个基于web的图形用户界面,用于直观地构建和运行AI模型流程。它特别适合于使用Stable Diffusion等模型进行图像生成任务。然而,ComfyUI本身并不直接提供老照片修复的功能,但你可以通过组合不同的节点来实现这一目标。 老照片修复通常涉及到几个关键步骤: 图像去…

人像修复-插件磨皮

破锤和DR5插件磨皮 破锤插件&#xff08;更快磨皮&#xff09;DR5&#xff08;更好保留皮肤纹理&#xff09; 破锤插件&#xff08;更快磨皮&#xff09; 打开方式&#xff1a;滤镜->Imagenomic->Portraiture 磨皮阈值一般控制在10-20之间若环境与肤色接近&#xff0c;容…

PYTHON专题-(3)你应该知道python内置函数

abs() 函数返回数字的绝对值。dict() 函数用于创建一个字典。help() 函数用于查看函数或模块用途的详细说明。min() 方法返回给定参数的最小值&#xff0c;参数可以为序列。max() 方法返回给定参数的最大值&#xff0c;参数可以为序列。round() 方法返回浮点数 x 的四舍五入值&…

【独家原创】基于APO-Transformer多变量回归预测【24年新算法】 (多输入单输出)Matlab代码

【独家原创】基于APO-Transformer多变量回归预测【24年新算法】 &#xff08;多输入单输出&#xff09;Matlab代码 目录 【独家原创】基于APO-Transformer多变量回归预测【24年新算法】 &#xff08;多输入单输出&#xff09;Matlab代码效果一览基本介绍程序设计参考资料 效果一…

中国数字孪生进入爆发期,平台级产品决定市场高度

MIT 教授 Geoffrey Parker在《平台革命》中认为&#xff0c;平台正在吞噬整个世界&#xff0c;平台赋予开放的参与式架构&#xff0c;设定合理的参与规则&#xff0c;通过创新的产品、服务为所有参与者创造价值。 与现实世界类似&#xff0c;在数字孪生世界中&#xff0c;数字…

分享5款.NET开源免费的Redis客户端组件库

前言 今天大姚给大家分享5款.NET开源、免费的Redis客户端组件库&#xff0c;希望可以帮助到有需要的同学。 StackExchange.Redis StackExchange.Redis是一个基于.NET的高性能Redis客户端&#xff0c;提供了完整的Redis数据库功能支持&#xff0c;并且具有多节点支持、异步编…

JavaScript基础——Date日期对象常见的用法

Date日期对象 查看Date日期对象的数据类型 创建Date日期对象的实例 获取Date日期对象的属性 设置Date日期对象的属性 日期和时间的比较 获取时间戳 比较时间戳 Date日期对象 JavaScript中的Date类型&#xff0c;提供了一种处理日期和时间的方法&#xff0c;用于创建表示…

OD C卷 - 多线段数据压缩

多段 线 数据压缩 &#xff08;200&#xff09; 如图中每个方格为一个像素&#xff08;i&#xff0c;j&#xff09;&#xff0c;线的走向只能水平、垂直、倾斜45度&#xff1b;图中线段表示为(2, 8)、&#xff08;3,7&#xff09;、&#xff08;3, 6&#xff09;、&#xff08…

tcp westwood 比 reno,cubic 好在哪

今天说说 tcp 韦斯特伍德&#xff0c;和昨天 dctcp 的路子一样&#xff0c;主要还是一个观点&#xff0c;信息带来性能收益。 reno&#xff0c;cubic 仅做孤立 aimd&#xff0c;没有将 rtt 用到极致&#xff0c;信息相当于浪费掉了&#xff0c;而 westwood 却充分利用 ack 和 …

Python数值计算(21)——非扭结点三次样条曲线

前面介绍到紧固和自然三次样条曲线&#xff0c;这次介绍一下非扭结点三次样条曲线。所谓的非扭结点&#xff0c;是指由于最开始的两个子区间使用插值多项式相同&#xff0c;最后两个子区间所使用的插值多项式也相同&#xff0c;这就会导致在这段多项式上起不到扭结点的效果&…

E26.【C语言】练习:打印整数二进制的奇数位和偶数位

获取一个整数二进制序列中所有的偶数位和奇数位&#xff0c;分别打印出二进制序列 要会打印奇或偶序列&#xff0c;先学会打印二进制序列 下面我的这篇文章的代码稍作修改即可 E24.【C语言】练习&#xff1a;求一个整数存储在内存中的二进制中1的个数&#xff08;两种方法&a…

一键体验Detectron2框架中的所有预训练模型

Detectron2是由Facebook AI Research (FAIR)推出的基于PyTorch的模块化物体检测库&#xff0c;发布于2019年10月10日。该平台原是2018年推出的Detectron的第二代版本&#xff0c;它完全重写于maskrcnn-benchmark&#xff0c;并采用了PyTorch语言实现。与原版相比&#xff0c;De…

(五)activiti-modeler 编辑器初步优化

最终效果: 1..首先去掉顶部的logo,没什么用,还占用空间。 修改modeler.html文件,添加样式: <style type="text/css"> #main-header{display: none; } #main{padding: 0px; } </style> 2.左边组件选择区域太宽了,一般用不到那么宽。 修改editor…

Linux驱动入门实验班day03-GPIO子系统概述

3.通用框架1——最简单方式1&#xff1a;执行命令cat /sys/kernel/debug/gpio查看串口信息 gpio4对应的下列 方式2&#xff1a; 对于按键GPIO4_14:对应第四组第14个引脚 gpiochip3 ,从96开始&#xff0c; 9614110&#xff1b;

如何获取公网IP

前言 有些时候我们需要获取电脑或者服务器的公网 IP&#xff0c;例如我们访问的目标地址需要限制 IP 白名单或者限制访问来源&#xff0c;又或者我们使用了代理&#xff0c;想试试有没有生效。要获取公网 IP 无法从电脑或服务器的本地配置中获取&#xff0c;如 ipconfig&#…

利用 Angular 发挥环境的力量

一.介绍 您是否曾想过如何在不同的环境中为同一应用设置不同的颜色、标题或 API 调用&#xff1f;可以肯定的是&#xff0c;生产 API 和测试 API 是不同的&#xff0c;应谨慎使用。部署时&#xff0c;我们不会在项目的所有地方手动更改所有 API 调用。不应这样做&#xff0c;因…

基于Yolov8面部七种表情检测与识别C++模型部署

表情识别 七种表情识别是一个多学科交叉的研究领域&#xff0c;它结合了心理学、认知科学、计算机视觉和机器学习等学科的知识和技术。 基本概念 表情的定义&#xff1a;表情是人们在情绪体验时面部肌肉活动的结果&#xff0c;是人类情感交流的基本方式之一。基本表情理论&a…