Java基础:Map集合

news2024/11/20 1:50:21

1. Map集合概述

现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口。

我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。

在这里插入图片描述

Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。

Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。

Collection中的集合称为单列集合,Map中的集合称为双列集合。

需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

2. Map常用子类

通过查看Map接口描述,看到Map有多个子类,主要介绍常用的HashMap集合、LinkedHashMap集合。

  • HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

  • LinkedHashMapHashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的 hashCode()方法、equals()方法。

Map接口中的集合都有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量的数据类型可以相同,也可以不同。

3. Map接口中的常用方法

Map接口中定义了很多方法,常用的如下:

  • public V put(K key, V value) :把指定的键与指定的值添加到Map集合中。

  • public V remove(Object key):把指定的键 所对应的键值对元素在Map集合中删除,返回被删除元素的值。

  • public V get(Object key):根据指定的键,在Map集合中获取对应的值。

  • public Set<K> keySet():获取Map集合中所有的键,存储到Set集合中。

  • public Set<Map.Entry<K,V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)。

Map接口的方法演示:

package com.dcxuexi.java17;

import java.util.HashMap;

/***
 * @Title Map_Demo
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2022/12/7 20:55
 * @Version 1.0.0
 */
public class Map_Demo {
    public static void main(String[] args) {
        //创建 map对象
        HashMap<String, String>  map = new HashMap<String, String>();

        //添加元素到集合
        map.put("赵又廷", "高圆圆");
        map.put("沙溢", "胡可");
        map.put("邓超", "孙俪");
        System.out.println(map);

        //String remove(String key)
        System.out.println(map.remove("邓超"));
        System.out.println(map);

        // 想要查看 赵又廷的媳妇 是谁
        System.out.println(map.get("赵又廷"));
        System.out.println(map.get("邓超"));
    }
}

在这里插入图片描述

使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;

若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。

4. Map集合遍历键找值方式

键找值方式:即通过元素中的键,获取键所对应的值

分析步骤:

  1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示: keyset()

  2. 遍历键的Set集合,得到每一个键。

  3. 根据键,获取键所对应的值。方法提示:get(K key)

代码演示:

package com.dcxuexi.java17;

import java.util.HashMap;
import java.util.Set;

/***
 * @Title Map_Demo02
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2022/12/7 21:03
 * @Version 1.0.0
 */
public class Map_Demo02 {
    public static void main(String[] args) {
        //创建 map对象
        HashMap<String, String> map = new HashMap<String, String>();
        //添加元素到集合
        map.put("胡歌", "霍建华");
        map.put("郭德纲", "于谦");
        map.put("薛之谦", "大张伟");
        System.out.println(map);

        //获取所有的键  获取键集
        Set<String> keys = map.keySet();
        // 遍历键集 得到 每一个键
        for (String key : keys) {
            //key  就是键
            //获取对应值
            String value = map.get(key);
            System.out.println(key+"的CP是:"+value);
        }
    }
}

在这里插入图片描述

遍历图解:

在这里插入图片描述

5. Entry键值对对象

我们已经知道,Map中存放的是两种对象,一种称为key( 键 ),一种称为value( 值),它们在在Map中是一一对应关系,这一对对象又称做Map中的一个Entry( 项) 。Entry 将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:

  • public K getKey():获取Entry对象中的键。

  • public V getValue():获取Entry对象中的值。

Map集合中也提供了获取所有Entry对象的方法:

  • public Set<Map.Entry<K,V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)。

6. Map集合遍历键值对方式

键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

操作步骤与图解:

  • 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示:entrySet()

  • 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。

  • 通过键值对(Entry)对象,获取Entry对象中的键与值。方法提示:getkey() getValue()

package com.dcxuexi.java17;

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

/***
 * @Title Map_Demo03
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2022/12/7 21:12
 * @Version 1.0.0
 */
public class Map_Demo03 {
    public static void main(String[] args) {
        // 创建Map集合对象
        HashMap<String, String> map = new HashMap<String,String>();
        // 添加元素到集合
        map.put("胡歌", "霍建华");
        map.put("郭德纲", "于谦");
        map.put("薛之谦", "大张伟");

        // 获取 所有的 entry对象  entrySet
        Set<Map.Entry<String,String>> entrySet = map.entrySet();

        // 遍历得到每一个entry对象
        for (Map.Entry<String, String> entry : entrySet) {
            // 解析
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"的CP是:"+value);
        }
    }
}

在这里插入图片描述

遍历图解:

在这里插入图片描述

Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。

7. HashMap存储自定义类型键值

练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。

注意,学生姓名相同并且年龄相同视为同一名学生。

编写学生类:

package com.dcxuexi.java17;

import java.util.Objects;

/***
 * @Title Student
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2022/12/7 21:31
 * @Version 1.0.0
 */
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
    
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

编写测试类:

package com.dcxuexi.java17;

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

/***
 * @Title Map_Test
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2022/12/7 21:33
 * @Version 1.0.0
 */
public class Map_Test {
    public static void main(String[] args) {
        //1,创建Hashmap集合对象。
        Map<Student,String> map = new HashMap<Student,String>();
        //2,添加元素。
        map.put(new Student("lisi",28), "上海");
        map.put(new Student("wangwu",22), "北京");
        map.put(new Student("zhaoliu",24), "成都");
        map.put(new Student("zhouqi",25), "广州");
        map.put(new Student("wangwu",22), "南京");

        //3,取出元素。键找值方式
        Set<Student> keySet = map.keySet();
        for(Student key: keySet){
            String value = map.get(key);
            System.out.println(key.toString()+" = "+value);
        }
    }
}

在这里插入图片描述

  • 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCodeequals方法。

  • 如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap集合来存放。

8. LinkedHashMap

我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序,还要速度快怎么办呢?

HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。

package com.dcxuexi.java17;

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

/***
 * @Title LinkedHashMap_Demo
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2022/12/7 21:43
 * @Version 1.0.0
 */
public class LinkedHashMap_Demo {
    public static void main(String[] args) {
        LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
        map.put("赵又廷", "高圆圆");
        map.put("沙溢", "胡可");
        map.put("邓超", "孙俪");
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for (Map.Entry<String, String> entry : entrySet) {
            System.out.println(entry.getKey() + " => " + entry.getValue());
        }
    }
}

结果:

在这里插入图片描述

9. Map集合练习

需求:

计算一个字符串中每个字符出现次数。

分析:

  1. 获取一个字符串对象

  2. 创建一个Map集合,键代表字符,值代表次数

  3. 判断Map中是否有该键。

  4. 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。

  5. 打印最终结果

代码:

package com.dcxuexi.java17;

import java.util.HashMap;
import java.util.Scanner;

/***
 * @Title Map_Test02
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2022/12/7 21:49
 * @Version 1.0.0
 */
public class Map_Test02 {
    public static void main(String[] args) {
        // 提示录入一个字符串
        System.out.println("请录入一个字符串:");
        String line = new Scanner(System.in).nextLine();
        // 定义 每个字符出现次数的方法
        findChar(line);
    }
    private static void findChar(String line) {
        //1:创建一个集合 存储  字符 以及其出现的次数
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        //2:遍历字符串
        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            //判断 该字符 是否在键集中
            if (!map.containsKey(c)) {//说明这个字符没有出现过
                //那就是第一次出现
                map.put(c, 1);
            } else {
                //先获取之前的次数
                Integer count = map.get(c);
                //count++;
                //再次存入  更新
                map.put(c, ++count);
            }
        }
        System.out.println(map);
    }
}

在这里插入图片描述

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

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

相关文章

IOC 容器

IOC 概念和原理 1. 什么是 IOC&#xff1f; 控制饭庄&#xff08; Inversion of Control &#xff0c;缩写为 IOC&#xff09;&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可以用来降低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入&#xff08; Depende…

基于SSM的网红书购物商城(源码+论文+开题报告+答辩PPT)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

java实现简单窗口小游戏“扫雷”

前言 忘记是从何处看到过关于扫雷小程序的文章&#xff0c;所以这次也就跟着做一下。其实很简单的&#xff0c;如果有java入门的同学也可以尝试一下自己做这种java小程序。几行代码做几遍基本上能摸清楚这些基础了&#xff0c;对于编程能力也能提高一些。&#xff08;虽然小编…

appium笔记——01环境搭建

0、关系图 1.appium客户端&#xff1a; python程序&#xff0c;链接appium服务器&#xff0c;并发送请求 2.appium服务端(模拟器客户端)&#xff1a; appium程序&#xff0c;需要提前启动&#xff0c;不仅充当appium服务端&#xff0c;还充当模拟器客户端&#xff08;接收h…

基于Apriori算法的购物网站商品推荐系统

基于Apriori算法的购物网站商品推荐系统 目 录 一、 算法内容 3 Step 1 收集用户偏好 3 Step 2 对数据进行预处理 3 Step 3 计算相似度 4 Step 4 找邻居 5 Step 5 计算推荐 6 二、 预期结果 6 三、 对比和讨论 7 Step 5 计算推荐 Section A 基于用户的协同过滤(User CF) 通过前…

Python中12个常用模块的使用教程

1. time模块 import time *一*#时间戳--》结构化时间--》格式化的字符串时间 ----------------------------------------------------------------------------- res1time.localtime(654126574) print(res1 ) #res1time.struct_time(tm_year1990, tm_mon9, tm_mday24, tm_hour…

数学大世界杂志数学大世界杂志社数学大世界编辑部2022年第7期目录

名家论坛《数学大世界》投稿&#xff1a;cn7kantougao163.com 新时期高中数学课堂教学有效性的提升策略 姜徳余; 3-5 化“零”为整&#xff0c;以“构”促学——小学数学结构化教学策略探析 孟龙平; 6-8 做反思型教师&#xff0c;加强数学衔接模块教学 陈小菊; 9-1…

[附源码]Python计算机毕业设计SSM基于远程协作的汽车故障诊断系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SELinux

文章目录SELinux说明SELinux 的运行模式SElinux命令SELinux 是 Security-Enhanced Linux 缩写&#xff0c;安全强化的linux 系统资源都是通过程序进行访问的&#xff0c;如果将/var/www/html权限设置为777&#xff0c;代表所有程序均可以对该目录访问&#xff0c;如果已启动www…

面试官狂问八股文?我已经被三家公司问到哑口无言……

秋招刚过去&#xff0c;整体的感受是&#xff1a;面试难度和拿 offer 的难度比往年难多了&#xff0c;而且互联网还有较大的裁员风险&#xff0c;网上各种消息不断&#xff0c;有时候真是焦虑到不行。 大家还是要早做准备&#xff0c;多面试积累经验&#xff0c;有些人总想准备…

WebDAV之葫芦儿·派盘+可乐记

可乐记 支持WebDAV方式连接葫芦儿派盘。 推荐一款小巧好用的便签类记事本软件,它能够帮助用户在手机上快捷的记录一些代办事项或者是当做一个日记本来记录心情,小容量设备的福音,它就是可乐记。 可乐记这款软件的界面非常的简单,用户在首页就能看到最近所创建的标签,用…

服务器远程端口怎么修改

服务器远程端口怎么修改 修改Windows系统实例默认远程端口 以Windows Server 2012为例介绍如何修改Windows系统实例默认远程端口。 远程连接进入服务器后修改注册表子项PortNumber的值。 按快捷键 Win&#xff08;Windows 徽标键&#xff09;R&#xff0c;启动运行窗口。输…

机器学习-模型评估与选择(待更新)

本章主要讲解机器学习的基础知识&#xff0c;有关一些专业术语的定义与解释。 文章目录2.1 经验误差与过拟合2.2 评估方法2.2.1 留出法2.2.2 交叉验证法2.2.3 自助法2.2.4 调参与最终模型2.3 性能度量2.3.1 错误率与精度2.3.2 查准率、查全率与F12.3.3 ROC与AUC2.1 经验误差与过…

诊断2F和14,19服务概述

关于2F 关于抑制位 关于14服务 关于19服务 在0x19服务中一般的使用顺序 1\0x19服务01子服务 通过状态掩码去查找与其相匹配的故障个数。 通过该服务诊断仪能够请求ECU中DTC状态与DTC状态掩码相匹配的故障码个数。如果某一个故障码的实际状态位为“1”&#xff0c;并且DTC状…

医院设置模块查询和删除功能的设计与实现

一、医院设置模块需求 医院设置主要是用来保存开通医院的一些基本信息&#xff0c;每个医院一条信息&#xff0c;保存了医院编号&#xff08;平台分配&#xff0c;全局唯一&#xff09;和接口调用相关的签名key等信息&#xff0c;是整个流程的第一步&#xff0c;只有开通了医院…

UGUI性能优化学习笔记(三)图片和图集

一、图片 1.1 纹理压缩 虽然我们可以将JPG、PNG之类的格式导入Unity作为纹理的源文件&#xff0c;但实际上&#xff0c;在导入Unity后&#xff0c;会自动对其进行纹理压缩。 为什么要进行纹理压缩&#xff1f; 每像素位数 (bpp) 表示单个纹理像素所需的存储量。bpp 值越低的…

简述供应链系统商品全生命周期管理价值,助力家用电器行业实现商品管理数字化

如今&#xff0c;随着数字化浪潮和消费升级叠加背景下&#xff0c;越来越多企业开始加速推进数字化的改造与升级&#xff0c;而家用电器行业作为我国经济发展不可或缺的中坚力量&#xff0c;现阶段许多家电企业的数字化管理水平还停留在初级阶段&#xff0c;难以适应变化多样的…

从弹性计算到数据处理——亚马逊云科技re:Invent

在2022亚马逊云科技re:Invent大会上&#xff0c;亚马逊云科技首席执行官Adam Selipsky说&#xff1a;“在今后的五年&#xff0c;我们创建了这些数据&#xff0c;可能会完全超过了数码时代一直到现在以来所有数据累加在一起的数量&#xff0c;这样同时也会告诉我们所有的组织都…

有哪些舆情监控方法,舆情监控工作机制?

一、舆情监控方法 1&#xff0c;组建新闻报道社会舆论舆情监控队伍 在言论高度自由的网络时代&#xff0c;人人都是自媒体&#xff0c;人人皆可表达意见。透过成立一队人才队伍的新闻报道社会舆论舆情监控各队能协助民营企业及时发现高度关注网络实时&#xff0c;迅速开展正面…

iphone13 ios 16.2降级15.6刷机教程

最近&#xff0c;更新了最新的ios16.2之后&#xff0c;系统经常出现卡屏卡死和异常耗电情况&#xff0c;最终决定对手机进行系统降级处理&#xff0c;下面是我的一个刷机过程。 目录 一、下载电脑版爱思助手 二、下载ios15.6版本固件 三、导入固件到爱思助手 四、刷机过程中…