(二十七)Map集合体系

news2024/9/21 20:30:34

目录

前言:

一、Map集合的遍历方式之一:键找值

二、Map集合的遍历方式之二:键值对

三、Map集合的遍历方式之三:Lambda表达式

四、Map集合的实现类HashMap

五、Map集合的实现类LinkedHashMap

六、Map集合的实现类TreeMap

七·、不可变集合


前言:

        ①Map集合是一种双列集合,每个元素包含两个数据;

        ②Map集合的每个元素的格式:key = value(键值对元素);

        ③Map集合也被称之为键值对集合。

2.Map集合整体格式:

        ①Collection集合的格式:[元素1,元素2,元素3...]

        ②Map集合的完整格式:{key1 = value1,key2 = value2,key3 = value3......}

3.Map集合是什么?使用场景是什么?

        Map集合是键值对集合;

        Map集合非常适合做购物车这样的业务场景;

4.Map集合体系的特点。

        ①Map集合的特点都是由键决定的。

        ②Map集合的键是无序,不重复的,无索引的,值不做要求;

        ③Map集合后面重复的键对应的值会覆盖前面重复键的值。

        ④Map集合的键值对都可以为null。

5.Map集合实现类特点。

        HashMap:元素按照键是无序,不重复,无索引,值不做要求。(与Map体系一致)。

        LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求。

        TreeMap:元素按照键是排序,不重复,无索引的,值不做要求。

一、Map集合的遍历方式之一:键找值

        先获取Map集合的全部键的Set集合;

        遍历键的Set集合,然后通过键提取对应值。

键找值涉及到的API:

 

二、Map集合的遍历方式之二:键值对

        先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型;

        遍历Set集合,然后提取键以及提取值。

键值对涉及到的API:

 

三、Map集合的遍历方式之三:Lambda表达式

        得益于JDK8开始的新技术Lambda表达式,提供了一种更简单,更直接的遍历集合的方式。

Map结合Lambda遍历的API:

 

9.代码演示:

/**Map  双列集合,每个元素包含两个数据
 * key = value(键值对元素)
 * 使用场景:购物车系统
 */
​
import java.util.*;
import java.util.function.BiConsumer;
​
/** Map  HashMap(LinkedHashMap)、HashTable(Properties)、...(TreeMap)
 * 使用最多 :HashMap  :无序、不重复、无索引
 * 重点掌握: HashMap、LinkHashMap、TreeMap
 * LinkHashMap: 有序、不重复、无索引
 * TreeMap : 排序,不重复、无索引
 * Map集合的特点由键决定   Map集合后面重复的键对应的值会覆盖前面重复键的值
 * 键值可以为Null
 */
public class Map_Demo {
    public static void main(String[] args) {
        //1.创建Map对象,添加元素
        Map<String,Integer> map = new HashMap<>();//经典代码
        map.put("鸿星尔克",30);
        map.put("JAVA书",300);
        map.put("Python书",100);
        map.put("Html",100);
        map.put(null,null);
        System.out.println(map);
        //2.清空集合
//        map.clear();
        //3.判断集合是否为空
        System.out.println(map.isEmpty());
        //4.根据键获取对应的值
        Integer key = map.get("Html");
        System.out.println(key);
        //5.根据键删元素
        map.remove("JAVA书");
        System.out.println(map);
        //6.判断是否包含某个键
        System.out.println(map.containsKey("Html"));
        System.out.println(map.containsKey("JAVA"));
        //7.判断是否包含某个值
        System.out.println(map.containsValue(100));
        System.out.println("====================================");
        //8.获取全部键的集合
        Set<String> keys= map.keySet();
        System.out.println(keys);
        //9.获取全部值的集合
        Collection<Integer> values = map.values();
        System.out.println(values);
        //10.集合的大小
        System.out.println(map.size());
        //11.合并其他Map集合
        Map<String,Integer> map1 = new HashMap<>();
        map1.put("JAVA1",70);
        map1.put("JAVA2",80);
        Map<String,Integer> map2 = new HashMap<>();
        map2.put("JAVA3",76);
        map2.put("JAVA2",80);
        map1.putAll(map2);
        System.out.println(map1);
​
        System.out.println("=====================");
        Map<String,Integer> maps = new HashMap<>();
        maps.put("鸿星尔克",40);
        maps.put("JAVA书",30);
        maps.put("Python书",20);
        maps.put("Html",10);
        System.out.println(maps);
​
        //1.键找值 先拿到集合的全部键
        Set<String> keyss = maps.keySet();
        //2.遍历每一个键,根据键提取值
        for (String s : keyss) {
            int value = maps.get(s);
            System.out.println(s + "====>"+value);
        }
        System.out.println("---------------------------------------");
        //遍历 
        maps.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String s, Integer value) {
                System.out.println(s + "====>"+value);
            }
        });
    }
}

10.案例:Map集合:统计投票人数

        需求:

                某个班级80名学生,现在需要组成秋游活动,班长提供了四个景点依次是(A,B,C,D),每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。

        分析:

                ①将80个学生选择的数据拿到程序中去;

                ②定义Map集合用于存储最终统计的结果;

                ③遍历80个学生选择的数据,看到Map集合中是否存在,不存在存入"数据=1",存在则其对应值+1.

import java.util.*;
​
/**
 * 统计投票人数
 */
public class Map_Test {
    public static void main(String[] args) {
        //1.把八十个学生选择的数据拿进来
        String[] selects = {"A","B","C","D"};
        StringBuilder sb= new StringBuilder();//拼接结果
        Random r = new Random();
        for (int i = 0; i < 80; i++) {
            sb.append(selects[r.nextInt(selects.length)]);
        }
        System.out.println(sb);
​
        //定义一个map集合记录最终信息
        Map<Character,Integer> infos = new HashMap<>();
        //遍历学生选择的数据
        for (int i = 0; i < sb.length(); i++) {
            //提取当前选择的字符
            char ch = sb.charAt(i);
            //判断map集合中是否存在这个键
            if (infos.containsKey(ch)){
                //如果存在此景点,让值+1
                infos.put(ch,infos.get(ch)+1);
            }else {
                //说明此经典第一次统计
                infos.put(ch,1);
            }
        }
        System.out.println(infos);
        System.out.println("=================================");
        /**集合的嵌套
         * 可以选择多个景点
         */
        //1.程序记录每个学生选择的情况,使用map集合存储
        Map<String, List<String>> date =new HashMap<>();//集合嵌套
        //把学生选择的数据存进去
        List<String> list = new ArrayList<>();
        Collections.addAll(list,"A","B");
        date.put("罗勇",list);
​
        List<String> list1 = new ArrayList<>();
        Collections.addAll(list1,"C","B","D");
        date.put("刘备",list1);
        System.out.println(date);
        //统计每个景点选择的人数
        Map<String,Integer> map = new HashMap<>();
        //提取所有人选择的景点的信息
        Collection<List<String>> values = date.values();
        System.out.println(values);
        for (List<String> value : values) {
            for (String s : value) {
                if (map.containsKey(s)){
                    map.put(s,map.get(s)+1);
                }else {
                    map.put(s,1);
                }
            }
        }
        System.out.println(map);
    }
}

四、Map集合的实现类HashMap

1.HashMap的特点

        ①HashMap是Map里面的一个实现类。特点都是由键决定的:无序,不重复,无索引。

        ②没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。

        ③HashMap跟HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap的每个元素包含两个值而已。

        ④实际上:Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。

2.HashMap的特点和底层原理

        ①由键决定:无序,不重复,无索引。HashMap底层是哈希表结构的。

        ②依赖hashMap方法和equals方法保证键的唯一。

        ③如果键要存储的是自定义的对象,需要重写hashCode和equals方法;

        ④基于哈希表,增删改查的性能都较好;

五、Map集合的实现类LinkedHashMap

1.概述和特点

        由键决定:有序,不重复,无索引。

        这里的有序指的是保证存储和取出的元素顺序一致。

2.原理:

        底层数据结构依然是哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。

六、Map集合的实现类TreeMap

1.概述和特点

        ①由键决定特性:不重复,无索引,可排序。

        ②可排序:按照键数据的大小默认升序(由小到大)排序,只能对键排序。

        ③注意:TreeMap集合是一定要排序的,可以默认排序,也可以将键按照指定的规则进行排序。

        ④TreeMap跟TreeSet的原理是一样的。

2.TreeMap集合自定义排序规则有2种:

        类实现Comparable接口,重写比较规则;

        集合自定义Comparator比较器对象,重写比较规则;

七·、不可变集合

1.什么是不可变集合?

        ①不可变集合就是不可被修改的集合;

        ②集合的数据项在创建的时候提供,并在整个生命周期中都不可改变。否则报错。

2.为什么要创建不可变集合?

        ①如果某个数据不能被修改,把它防御性的拷贝到不可变集合中是个很好的实践;

        ②或者当集合对象被不可信的库调用时,不可变形式是安全的;

3.如何创建不可变集合?

        在List,Set,Map接口中,都存在of方法,可以创建一个不可变的集合。

 

4.代码演示:

import java.util.List;
​
/** 不可变集合  不可被修改的集合
 * 集合的数据在创建的时候提供,并且在生命周期中都不可被修改,否则报错。
 * 为什么创建不可变集合 :数据不能被修改的时候或者集合对象被不可信的库调用的时候,不可变形式是安全的。
 * List、Set、Map、都存在of方法,可以创建一个不可变的集合   :创建一个具有指定元素的集合
 *
 */
public class NoCharge_Demo6 {
    public static void main(String[] args) {
        List<Double> lists = List.of(569.0, 461.7, 356.5, 465.4);//不能new集合,new的集合是可变的
//        lists.add(689);  //不可添加,不可修改,不可变的固定数据
        System.out.println(lists);
​
        double score = lists.get(1);//仅可查看
        System.out.println(score);
    }
}

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

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

相关文章

机器学习中的聚类算法

1. 概述根据所拥有的数据&#xff0c;可以使用三种不同的机器学习方法&#xff0c;包括监督学习、半监督学习和无监督学习。在监督学习中&#xff0c;根据已标记数据&#xff0c;因此可以确定输出是关于输入的正确值。通过半监督学习&#xff0c;用户将拥有一个大型数据集&…

提高mysql性能:设计阶段

合适的表设计 基本原则 避免太多的列 太多的列会导致mysql从行缓存中将编码过的列转换为行数据时花费大量大代价。 减少太多的关联 为减少太多的关联造成解析和查询的性能影响&#xff0c;应该将单表的关联控制在12个之内。 合理使用枚举 枚举只适用于值相对固定&#x…

go入门——基础语法

go环境安装 1、安装 go官网&#xff1a;Downloads - The Go Programming Language (google.cn) go中文网&#xff1a;Go下载 - Go语言中文网 - Golang中文社区 (studygolang.com) 这里我是amd64位win10系统&#xff0c;所以我下载这个 下载完成之后安装到自己喜欢的目录就好…

Java:基于XML的Spring使用【IOC容器】

基于XML的Spring使用一、Spring IOC 底层实现1.1 BeanFactory与ApplicationContexet1.2 图解IOC类的结构二、 Spring依赖注入数值问题【重点】2.1 字面量数值2.2 CDATA区2.3 外部已声明bean及级联属性赋值2.4 内部bean2.5 集合三、 Spring依赖注入方式【基于XML】3.1 set注入3.…

电子技术——MOS管的CV特性

电子技术——MOS管的CV特性 MOS管是一种压控晶体管&#xff0c;本节我们学习MOS管的CV特性&#xff0c;即电压-电流特性。MOS管的特性曲线有两种&#xff0c;分别是伏安特性和传导特性。 iD−vDSi_D-v_{DS}iD​−vDS​ 特性曲线 为了测量MOS管的 iD−vDSi_D-v_{DS}iD​−vDS​…

ctfshow黑盒测试篇

文章目录web380web381web382web383web384web385web386web387web388web389web390web391web392web393web394、395web380 目录扫出来了page.php $id应该是传的参数&#xff0c;是php的文件名 page.php?idflag 访问源码拿到flag web381 就是这个目录 /alsckdfy/ 访问就是flag …

力扣(LeetCode)1664. 生成平衡数组的方案数(C++/Python3)

题目描述 模拟 逆向思维&#xff08;删除元素的性质&#xff09;&#xff1a;删除数组的某个元素&#xff0c;左侧元素的下标不变&#xff0c;右侧元素的下标发生奇偶替换。 算法流程 ① 由于算法从右往左枚举&#xff0c;预处理左侧的奇数下标元素之和oddl&#xff0c;偶数下…

过万春节服务全是问题无语了-Harbor镜像仓库访问404

1、背景 春节后的周六补班&#xff0c;累啊&#xff0c;到公司发现docker和kubelet服务都被停止了&#xff0c;可能是春节期间担心发生安全隐患吧&#xff0c;服务启动后发现很多镜像无法拉取了 到相关的节点上去尝试拉取镜像发现报了404错误 docker pull xxx.xxx.xxx.xxx/d…

初学者如何学好Java数组,不妨点进来看看,赶在新年前肝完的万字博客

新年好~~~新年开篇万字博客 —Java数组的学习,有点干货,建议收藏观看!!! 本篇介绍了数组的概念,数组创建和初始化.数组的使用(元素访问,和数组遍历方法),初识引用数据类型,简单介绍JVM内存分布,认识null,堆区空间的释放 二维数组相关知识的介绍~ 学习Java中的数组一.数组的基本…

变增益PID(含5种变增益模式PLC源代码+Simulink仿真)

变增益PID的详细理论讲解和应用场景,请参看下面的文章链接: 增益自适应PI控制器+死区过滤器(Smart PLC向导PID编程应用)_RXXW_Dor的博客-CSDN博客增益自适应和死区过滤器如果不和S7-200 SMART PLC PID向导组合实现,大家可以自行编写优化的PID指令。算法起始非常简单,具体…

2 分钟就能抓取任何网站的数据是怎么做到的?? #Browse AI

尽管现在使用网络的方式或多或少与 20 年前相同&#xff0c;但网络在我们生活中占据的地位越来越重要&#xff0c;网站却变得越来越繁琐。最重要的是&#xff0c;即使网络上有大量有价值的实时数据&#xff0c;收集它们也是非常昂贵和耗时的。Browse AI 是一款可以从任何网站提…

untiy TextMeshPro(简称TMP)组件详细内容

首先unity官方API对该组件的描述是&#xff1a; TextMeshPro 是 Unity 的最终文本解决方案。它是 Unity UI Text 和旧版 Text Mesh 的完美替代方案。 功能强大且易于使用的 TextMeshPro&#xff08;也称为 TMP&#xff09;使用高级文本渲染技巧以及一组自定义着色器&#xff1b…

Numpy(4)—Numpy 数组操作(修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、数组元素的添加与删除

Numpy 数组操作 &#xff08;1&#xff09;修改数组形状 import numpy as npa np.arange(8) print (原始数组&#xff1a;) print (a) print (\n)b a.reshape(4,2) print (修改后的数组&#xff1a;) print (b)1&#xff09;numpy.ndarray.flat import numpy as npa np.a…

【ARM体系结构】之寄存器与三级流水线

1、ARM核的寄存器组织 1.1 寄存器概念介绍 控制器&#xff1a;控制程序运行&#xff0c;进行取指令操作&#xff0c;并将指令给到对应的运算器执行指令。 运算器&#xff1a;执行汇编指令&#xff0c;执行指令需要的使用的数据来源于寄存器&#xff0c;并将执行的执行结果返回…

如何在服务器上安装相应的依赖和包

我感觉这一篇的逻辑写的比较奇怪&#xff0c;于是想重写一篇。 python setup.py install报错“error: can‘t create or remove files in install directory”_ACMSunny的博客-CSDN博客 开始遇到的问题是要跑的程序数据太大&#xff0c;咱们通常会将本机上的Python程序和数据…

MIT6.830-2022-lab6实验思路详细讲解

系列目录 lab1 地址 : lab1 lab2 地址 :lab2 lab3 地址 :lab3 lab4 地址 :lab4 lab5 地址 :lab5 lab6 地址 :lab6 文章目录系列目录一、实验概述SimpleDB日志格式steal/force策略:二、实验正文Exercise 1 - rollbackExercise 2 - Recovery总结一、实验概述 In this lab y…

【SAP Fiori】X档案:Node.js 与 SAPUI5 开发环境的安装与配置

Node.js 与 SAPUI5 开发环境的安装与配置一、安装Node.js1、下载2、安装3、配置环境变量4、验证5、更改路径6、更改镜像源二、安装 Vue.js1、安装Vue2、查看版本三、安装webpack1、安装webpack2、安装webpack-cli3、验证是否安装成功四、新建Vue项目1、创建项目2、启动项目五、…

使用NoneBot2可视化平台搭建QQ聊天机器人:本地和云部署教程

NoneBot是一个基于Python 3.8的异步、开源和可扩展的框架&#xff0c;用于构建和运行聊天机器人&#xff0c;支持各种聊天平台&#xff0c;如Telegram&#xff0c;Discord和WeChat。它是基于nonebot库构建的&#xff0c;提供了一个易于使用的界面&#xff0c;用于创建聊天机器人…

Python爬虫之Scrapy框架系列(7)——XXTop250电影简介信息的获取及存储到本地

前面简单爬取了某Top250电影的一些信息。本文&#xff0c;来尝试搞到每个电影的简介信息。 目录&#xff1a;1. 获取电影简介信息1.1 第一步&#xff1a;配对每个电影对应的简介信息&#xff1a;First&#xff1a;包含电影简介信息url的获取Second&#xff1a;爬虫文件的更改Th…

Java和Scala中关键字package指定的是源文件的存放路径吗?

无为也&#xff0c;则用天下而有余&#xff1b;有为也&#xff0c;则为天下用而不足&#x1f52c; 目录 Scala代码演示 Java代码演示 总结 写在前面&#xff1a; 包&#xff08;package&#xff09;不是约定源文件存放的位置&#xff0c;而是约定源文件编译后生成的字节码…