【JAVA基础篇教学】第十篇:Java中Map详解说明

news2024/11/23 9:06:06

博主打算从0-1讲解下java基础教学,今天教学第十篇:Java中Map详解说明。  

在 Java 编程中,Map 接口代表了一种键值对的集合,每个键对应一个值。Map 接口提供了一系列操作方法,可以方便地对键值对进行增删改查等操作。本文将介绍 Map 接口的基本概念以及如何在 Java 中使用 Map 接口。

一、Map 接口概述

Map 接口是 Java Collections Framework 中的一部分,位于 java.util 包中。它是一个接口,代表了一种键值对的集合,每个键对应一个值。Map 接口允许键值对具有唯一性,即同一个键只能对应一个值。

Map 接口的主要特点包括:

  • 键的唯一性:Map 中的键是唯一的,不能包含重复的键。
  • 允许空键和空值:Map 中可以包含空键和空值。
  • 可以通过键来查找值:可以通过键来查找对应的值,并且可以根据需要修改、删除或者添加键值对。

二、Map 接口的常见实现类

Java 中常见的 Map 接口的实现类包括:

  1. HashMap:基于哈希表实现的键值对集合,无序且不保证键值对的顺序。
  2. TreeMap:基于红黑树实现的键值对集合,按键的自然顺序或者自定义顺序进行排序。
  3. LinkedHashMap:继承自 HashMap,内部使用双向链表维护键值对的顺序,可以保持键值对的插入顺序或者访问顺序。

在本文中,我们将主要介绍 HashMap 的使用。

三、使用示例

下面是一个使用 Map 接口的 HashMap 实现的示例代码:

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

public class Main {
    public static void main(String[] args) {
        // 创建一个 HashMap 对象
        Map<String, Integer> myMap = new HashMap<>();

        // 添加键值对到集合
        myMap.put("Apple", 10);
        myMap.put("Banana", 20);
        myMap.put("Orange", 30);

        // 获取集合大小
        int size = myMap.size();
        System.out.println("Map size: " + size);

        // 访问集合中的值
        System.out.println("Value for key 'Apple': " + myMap.get("Apple"));
        System.out.println("Value for key 'Banana': " + myMap.get("Banana"));

        // 遍历集合并打印每个键值对
        System.out.println("All key-value pairs:");
        for (Map.Entry<String, Integer> entry : myMap.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }

        // 检查集合中是否包含某个键
        boolean containsKey = myMap.containsKey("Banana");
        System.out.println("Does map contain key 'Banana'? " + containsKey);

        // 删除集合中的某个键值对
        myMap.remove("Banana");
        System.out.println("After removing key 'Banana':");
        System.out.println(myMap);

        // 清空集合
        myMap.clear();
        System.out.println("After clearing the map:");
        System.out.println(myMap);
    }
}

四、 HashMap,TreeMap,LinkedHashMap区别

1、HashMap

  • 数据结构:HashMap 基于哈希表实现,内部使用数组和链表/红黑树(JDK8+)来存储键值对。
  • 无序性:HashMap 不保证键值对的顺序,即遍历时输出的顺序可能是随机的。
  • 性能:HashMap 的插入、删除和查找操作的平均时间复杂度为 O(1),具有很好的性能。
  • 允许空键和空值:HashMap 允许键和值都为 null。

2、TreeMap

  • 数据结构:TreeMap 基于红黑树实现,内部使用红黑树来存储键值对,并且保持键的有序性。
  • 有序性:TreeMap 会按键的自然顺序或者自定义顺序进行排序,因此遍历时输出的键值对是有序的。
  • 性能:TreeMap 的插入、删除和查找操作的时间复杂度为 O(log n),比 HashMap 略慢。
  • 不允许空键:TreeMap 不允许键为 null,但允许值为 null。

3、LinkedHashMap

  • 数据结构:LinkedHashMap 继承自 HashMap,内部使用双向链表来维护键值对的顺序,可以保持插入顺序或者访问顺序。
  • 有序性:LinkedHashMap 可以按照插入顺序或者访问顺序来遍历输出键值对。
  • 性能:LinkedHashMap 的性能与 HashMap 类似,但由于额外维护了链表,可能会稍微慢一些。
  • 允许空键和空值:LinkedHashMap 允许键和值都为 null。

4、输出排序情况示例

下面是一个示例,展示了对 HashMap、TreeMap 和 LinkedHashMap 进行添加元素后的输出排序情况:

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        // HashMap 示例
        Map<String, Integer> hashMap = new HashMap<>();
        hashMap.put("Banana", 2);
        hashMap.put("Apple", 1);
        hashMap.put("Orange", 3);
        hashMap.put("Cool", 5);
        hashMap.put("Door", 4);
        System.out.println("HashMap:");
        System.out.println(hashMap);

        // TreeMap 示例
        Map<String, Integer> treeMap = new TreeMap<>();
        treeMap.put("Banana", 2);
        treeMap.put("Apple", 1);
        treeMap.put("Orange", 3);
        treeMap.put("Cool", 5);
        treeMap.put("Door", 4);
        System.out.println("TreeMap:");
        System.out.println(treeMap);

        // LinkedHashMap 示例
        Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put("Banana", 2);
        linkedHashMap.put("Apple", 1);
        linkedHashMap.put("Orange", 3);
        linkedHashMap.put("Cool", 5);
        linkedHashMap.put("Door", 4);
        System.out.println("LinkedHashMap:");
        System.out.println(linkedHashMap);
    }
}

很明显:

  • hashMap的输出,顺序是随机的。
  • treeMap的输出,是根据字母自然排序的。是根据键的自然顺序或者通过传入的比较器(Comparator)进行排序的。
  •  linkedHashMap的输出,是按照你插入的顺序。

这里要注意一下,当你多次运行程序时,你会发现hashmap的输出趋向于有序?

这里解答下

虽然 HashMap 不保证元素的顺序,但是在实际使用中,对于相同的哈希表大小和相同的哈希函数,相同的元素插入顺序往往会导致相同的哈希码分布,从而使得元素在哈希表中的位置趋于相同,进而使得元素的遍历顺序看起来是有序的。这种现象称为“桶中的元素顺序”。

但是,这种“有序性”仅仅是一种“看起来”的现象,实际上 HashMap 并不保证元素的顺序,因此不应该依赖于遍历结果的顺序。如果需要有序的遍历,应该使用 TreeMap 或者 LinkedHashMap,它们会根据键的自然顺序或者插入顺序进行有序遍历。

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

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

相关文章

大唐极简史

唐朝&#xff08;618年-907年&#xff09;&#xff0c;是中国历史上一个强盛的朝代&#xff0c;以其疆域辽阔、政治稳重、经济繁荣、文化繁荣而著称。唐朝的开国皇帝是李渊&#xff0c;他建立了一个强大的中央集权政府&#xff0c;使得唐朝成为当时世界上最繁荣的国家之一。 唐…

观察者模式:实现高效事件驱动编程的策略

在软件开发中&#xff0c;观察者模式是一种关键的行为型设计模式&#xff0c;用于建立对象间的一种依赖关系&#xff0c;使得当一个对象改变状态时&#xff0c;所有依赖于它的对象都会得到通知并被自动更新。这种模式是事件监听和响应编程的基石。本文将详细介绍观察者模式的定…

[Classifier-Guided] Diffusion Models Beat GANs on Image Synthesis

1、介绍 针对diffusion models不如GAN的原因进行改进&#xff1a; 1&#xff09;充分探索网络结构 2&#xff09;在diversity和fidelity之间进行trade off 2、改进 1&#xff09;在采样步数更少的情况下&#xff0c;方差设置为固定值并非最优。需要将表示为网络预测的v ​​​…

iPhone中的短信不小心删除了,使用三种方法教你怎么恢复?

在操作智能手机时&#xff0c;我们可能不小心误删了一些关键短信。遇到这种情况&#xff0c;我们该如何应对呢&#xff1f;小编将分享3种方法来解决这一问题。 第一种方法是利用最近删除文件夹。需要注意的是&#xff0c;已删除的短信在此文件夹中保存的时间最多为30天。 第二种…

第15届蓝桥杯模拟赛第一期

额。。。。提前声明水文章&#xff0c;题目都不难。 文章目录 1. 字母数2. 大乘积3. 星期几4.列名5. 最大连通6. 清理水域7. 信号覆盖8. 附近最小9. 第三小10. 3个111. 装苹果12. 删字母13. 统计次数14. 最小数位和15. 对折次数16. 相近分解17. 电扇控制18. 最尖位置 明天就要…

深度学习pytorch好用网站分享

深度学习在线实验室Featurizehttps://featurize.cn/而且这个网站里面还有一些学习教程 免费好用 如何使用 PyTorch 进行图像分类https://featurize.cn/notebooks/5a36fa40-490e-4664-bf98-aa5ad7b2fc2f 华为modelArtshttps://bbs.huaweicloud.com/forum/thread-76328-1-1.html…

分类算法——KNN算法(二)

什么是K-近邻算法 1KNN原理 K Nearest Neighbor算法又叫KNN算法&#xff0c;这个算法是机器学习里面一个比较经典的算法&#xff0c;总体来说KNN算法是相对比较容易理解的算法。 定义 如果一个样本在特征空间中的k个最相似&#xff08;即特征空间中最邻近&#xff09;的样本…

厂区3D全景线上漫游体验突破现实时空阻碍

智慧园区&#xff0c;作为现代城市发展的重要引擎&#xff0c;其管理效率和安全监控的需求日益凸显。而720VR全景展示技术的引入&#xff0c;无疑为智慧园区的建设注入了新的活力。通过360全空间无死角的视觉展示&#xff0c;用户可以身临其境地感受园区的每一个角落&#xff0…

VXWorks6.9 + Workbench3.3 开发环境部署

VxWorks系列传送门 一、安装包 有需要的朋友可以私信~ 二、安装 安装挺简单 1、先安装DVD-R147826.1-1-01-vx69.udf.iso 镜像中的Setup.exe程序&#xff0c;记住要使用管理员权限 2、再安装DVD-R147826.1-23-00.iso 镜像中的Setup.exe程序&#xff0c;同样要使用管理员权限 3…

数据结构--链式栈

一.链式栈的栈顶在哪里? 二.链栈的结构: typedef struct LSNode{ int data; struct LSNode* next; }LSNode ,*PLStack; //链栈的节点.由于栈顶在第一个数据节点,所以不需要top指针 三.链式栈的实现: //初始化LSNode* p (LSNode*)malloc(sizeof(LSNode));assert(p ! NULL)…

MySQL数据库的详解(1)

DDL&#xff08;数据库操作&#xff09; 查询 查询所有数据库&#xff1a;show databases;当前数据库&#xff1a;select database(); 创建 创建数据库&#xff1a;create database [ if not exists] 数据库名 ; 使用 使用数据库&#xff1a;use 数据库名 ; 删除 删除数…

2024年MathorCup数模竞赛C题超详细解题思路

妈妈杯本次比赛报名队伍号高达12500&#xff0c;这也就意味着大概一万只队伍参加报名&#xff0c;仅仅在报名人数这一项&#xff0c;妈妈杯已经成为美赛国赛之后的第三大竞赛。C题作为本次竞赛最简单也最容易获奖的题目&#xff0c;本文将给大家带来手把手超详细解题思路。 注…

kali桥接校园网实现上网

1.查看校园网信息 1. vim /etc/network/interfaces 添加下列信息&#xff0c;地址、网关、掩码和主机一样即可 3.vim /etc/resolv.conf 添加dns解析 4.macchanger -m AA:bb:cc:DD:ee:ff eth0(改为和主机一样的mac) 5. /etc/init.d/networking restart 重启网络即可

vs2022启动cmake项目(qt+c++)

1.本工程&#xff0c;如图&#xff0c;1个cmakelist.txt3个文件 2.启动vs 3.选择文件夹 4.进入这个页面&#xff0c;就说明配置没问题 5.启动 6.最后会自己生成其他文件

【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框

往期回顾&#xff1a; 【QT入门】 Qt自定义控件与样式设计之qss选择器-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QLineEdit的qss使用-CSDN博客 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬…

木头姐最新访谈:英伟达“卖早了”没什么,新买的Coinbase涨得更好

木头姐表示&#xff0c;虽然英伟达在本轮AI竞赛中处于领先地位&#xff0c;但要证明其定价合理&#xff0c;还需要找到更多能够证明AI正在加速企业收入增长的证据。她仍看好特斯拉的长期前景&#xff0c;主要基于其在自动驾驶和人形机器人领域的领先地位。 木头姐精彩观点 我们…

外观模式:简化复杂系统的统一接口

在面向对象的软件开发中&#xff0c;外观模式是一种常用的结构型设计模式&#xff0c;旨在为复杂的系统提供一个简化的接口。通过创建一个统一的高级接口&#xff0c;这个模式帮助客户端通过一个简单的方式与复杂的子系统交互。本文将详细介绍外观模式的定义、实现、应用场景以…

Java 怎么捕捉 Windows 中前台窗口的改变?

在Java中捕捉Windows中前台窗口的改变通常需要使用JNI&#xff08;Java Native Interface&#xff09;来调用Windows API。Windows API提供了一系列函数来获取有关窗口和进程的信息&#xff0c;通过使用这些函数&#xff0c;我们可以实现在Java程序中监视和捕捉Windows前台窗口…

redux-persist

npm install redux-persist 目录&#xff1a;&#xff08;分模块&#xff09; 之前未加入持久化的代码&#xff1a; import { legacy_createStore as createStore } from redux import { combineReducers } from "redux"; import countReducer from ./modules/cou…

小红的白色字符串

题目描述 小红拿到了一个字符串&#xff0c;她准备将一些字母变成白色&#xff0c;变成白色的字母看上去就和空格一样&#xff0c;这样字符串就变成了一些单词。 现在小红希望&#xff0c;每个单词都满足以下两种情况中的一种&#xff1a; 1.开头第一个大写&#xff0c;其余为…