Java中的Map集合体系

news2025/1/17 3:01:44

Map集合体系

  • Map集合的概述
  • Map集合体系特点
  • Map集合常用API
  • Map集合的遍历方式:
    • 方式一:键找值
    • 方式二:键值对
    • 方式三:lambda表达式
  • Map集合的实现类HashMap
  • Map集合的实现类TreeMap
  • 集合嵌套

Map集合的概述

Map集合概述和使用:
1.Map集合是一种双列集合,每个元素包含两个数据。
2.Map集合的每个元素的格式:key=value(键值对元素)。
3.Map集合也被称为“键值对集合”。

Map集合整体格式:
1.Collection集合的格式:[元素1,元素2,元素3…]
2.Map集合的完整格式:{key1 = value1,key2 = vakue2,key3 = value3, …}

Map集合的使用场景之一:购物车系统
分析:
1.购物车提供的四个商品和购买的数量在后台需要容器存储。
2.每个商品对象看成是Map集合的键,购买数量看成Map集合的值。
{商品1=2,商品2=3,商品3=2}

Map集合体系特点

在这里插入图片描述
1.Map集合的特点都是由键决定的。
2.Map集合的键是无序、不重复的,值不做要求可以重复。
3.Map集合后面重复的键对应的值会覆盖前面重复键的值。
4.Map集合的键值对都可以为null。

Map集合实现类特点:
1.HashMap:元素按照键是无序,不重复,无索引,值不做要求。(与Map体系一致)。
2.LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求。
3.TreeMap:元素按照键是排序,不重复,无索引的,值不做要求。

package d5_Map;
import java.util.HashMap;
import java.util.Map;

public class MapDemo {
    public static void main(String[] args) {
        // 创建一个Map集合对象
        Map<String,Integer> maps = new HashMap <>();
        maps.put("Java", 1);
        maps.put("mysql", 2);
        maps.put("python", 3);
        maps.put("Java", 10);
        System.out.println(maps); // {Java=10, python=3, mysql=2}
    }
}

Map集合常用API

Map是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的。
Map API如下:

在这里插入图片描述

package d5_Map;
import java.util.*;

public class MapDemo {
    public static void main(String[] args) {
        // 创建一个Map集合对象
        Map<String,Integer> maps = new HashMap <>();
        maps.put("Java", 10);
        maps.put("mysql", 20);
        maps.put("Java", 100);
        maps.put("python", 100);
        maps.put("HTML", 10);
        maps.put("CSS", 10);
        System.out.println(maps); //{Java=100, python=100, CSS=10, mysql=20, HTML=10}
        // 清空集合
//        maps.clear();
//        System.out.println(maps); // {}
        // 判断集合是否为空,为空返回true,反之
        System.out.println(maps.isEmpty()); // false
        // 根据键获取对应值:
        Integer key = maps.get("Java");
        System.out.println(key); //100
        System.out.println(maps.get("js")); //null
        // 根据键删除整个元素
        maps.remove("CSS");
        System.out.println(maps); //{Java=100, python=100, mysql=20, HTML=10}
        // 判断是否包含某个键
        System.out.println(maps.containsKey("HTML")); //true
        // 判断是否包含某个值
        System.out.println(maps.containsValue(100)); //true
        // 获取所有的键
        Set keys = maps.keySet();
        System.out.println(keys); // [Java, python, mysql, HTML]
        // 获取全部值集合
        Collection<Integer> values = maps.values();
        System.out.println(values); // [100, 100, 20, 10]
        // 集合的大小
        System.out.println(maps.size()); // 4
        // 合并集合
        Map<String,Integer> map1 = new HashMap <>();
        map1.put("java1", 1);
        map1.put("java2", 2);
        System.out.println("map1集合:"+map1); // {java2=2, java1=1}
        Map<String,Integer> map2 = new HashMap <>();
        map2.put("java3", 3);
        map2.put("java4", 4);
        System.out.println("map2集合:"+map2); // {java4=4, java3=3}
        // 集合合并
        map1.putAll(map2);
        System.out.println("合并后的map1:"+map1); // {java4=4, java3=3, java2=2, java1=1}
    }
}

Map集合的遍历方式:

方式一:键找值的方式遍历,先获取Map集合全部的键,再根据遍历键找值。
方式二:键值对的方式遍历,把"键值对"看成一个整体,难度较大。
方式三:JDK1.8开始之后的新技术:Lambda表达式。

方式一:键找值

在这里插入图片描述
1.先获取Map集合的全部键的Set集合。
2.遍历键的Set集合,然后通过键提取对应值。
用到的API:

在这里插入图片描述

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

public class MapDemo1 {
    public static void main(String[] args) {
        // 创建一个Map集合对象
        Map <String,Integer> maps = new HashMap <>();
        maps.put("Java", 10);
        maps.put("mysql", 20);
        maps.put("python", 100);
        maps.put("HTML", 10);
        maps.put("CSS", 10);
        System.out.println(maps);
        // 键找值,第一步,获取集合的全部键
        Set<String> keys = maps.keySet();
        // 遍历每个键,提取每个值
        for (String key : keys) {
            int value = maps.get(key);
            System.out.println(key+"="+value);
        }
    }
}

方式二:键值对

在这里插入图片描述
1.先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型了。
2.遍历Set集合,然后提取以及提取值。
键值对涉及到的API:

在这里插入图片描述

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

public class MapDemo1 {
    public static void main(String[] args) {
        // 创建一个Map集合对象
        Map <String,Integer> maps = new HashMap <>();
        maps.put("Java", 10);
        maps.put("mysql", 20);
        maps.put("python", 100);
        maps.put("HTML", 10);
        maps.put("CSS", 10);
        System.out.println(maps);
        
        // 键值对:把Map集合转化成Set集合,封装成键值对类型
        Set<Map.Entry<String,Integer>> entries = maps.entrySet();
        // 开始遍历
        for(Map.Entry<String,Integer> entry : entries){
            String key = entry.getKey();
            int valus = entry.getValue();
            System.out.println(key+"="+valus);
        }
    }
}

方式三:lambda表达式

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

在这里插入图片描述

package d5_Map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
public class MapDemo1 {
    public static void main(String[] args) {
        // 创建一个Map集合对象
        Map <String,Integer> maps = new HashMap <>();
        maps.put("Java", 10);
        maps.put("mysql", 20);
        maps.put("python", 100);
        maps.put("HTML", 10);
        maps.put("CSS", 10);
        System.out.println(maps);

        // lambda表达式:
        maps.forEach(new BiConsumer <String, Integer>() {
            @Override
            public void accept(String key, Integer value) {
                System.out.println(key+"="+value);
            }
        });
        // 简化:
        maps.forEach((String key, Integer value)-> System.out.println(key+"="+value));
    }
}

案例:Map集合统计投票人数
需求:
某个班级80名学生,现在需要组成秋游活动,班长提供了四个景点依次是(A,B,C,D),每个学生只能选择一个景点,请统计出最终那个景点想去的人数最多。
分析:
1.将80个学生选择的数据拿到程序中去。
2.定义Map集合用于存储最终统计的结果。
3.遍历80个学生选择的数据,看Map集合中是否存在,不存在存入“数据=1”,存在则其对应值+1。

package d8_maptest;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class MapTest {
    public static void main(String[] args) {
        // 把80个学生选择的数据拿进来
        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<Character,Integer> infos = new HashMap <>();
        // 遍历80个学生选择数据
        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);
            }
        }
        // 输出map集合
        System.out.println(infos);
    }
}

Map集合的实现类HashMap

在这里插入图片描述
使用最多的Map集合是HashMap。
HashMap的特点:
1.HashMap是Map里面的一个实现类。特点都是由键决定的:无序、不重复、无索引。
2.没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
3.HashMap跟HashSet底层原理是一样的,都是哈希表结构,只是HashMap的每个元素包含两个值而已。
实际上:Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。
HashMap的添加规则:

在这里插入图片描述
HashMap的特点和底层原理:
1.由键决定:无序、不重复、无索引。HashMap底层是哈希表结构的。
2.依赖hashCode方法和equals方法保证键的唯一。
3.基于哈希表。增删改查的性能都比较好。

package d9_map_impl;
import com_collection_set.Student;
import java.util.HashMap;
import java.util.Map;

public class HashMapDemol {
    public static void main(String[] args) {
        // Map集合是根据键去除重复元素
        Map <Student,String> maps = new HashMap <>();
        Student s = new Student("snow",20,'男');
        Student s1 = new Student("snow",20,'男');
        Student s2 = new Student("dream",23,'男');
        
        maps.put(s,"广州");
        maps.put(s1,"北京");
        maps.put(s2,"上海");

        System.out.println(maps);
    }
}

LinkeHashMap集合概述和特点:
1.由键决定:有序、不重复、无索引。
2.这里的有序指的是保证存储和取出的元素顺序一致。
原理:底层数据结构依然是哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。

在这里插入图片描述

package d9_map_impl;
import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapDem {
    public static void main(String[] args) {
        // 创建一个Map集合对象
        Map <String,Integer> maps = new LinkedHashMap <>();
        maps.put("Java", 10);
        maps.put("mysql", 20);
        maps.put("python", 100);
        maps.put("HTML", 10);
        maps.put("CSS", 10);
        System.out.println(maps);
    }
}

Map集合的实现类TreeMap

TreeMap集合概念和特点:
1.由键决定特性:不重复、无索引、可排序
2.可排序:按照键数据的大小默认升序(有小到大)排序,只能对键排序。
3.TreeMap跟TreeSet一样底层原理是一样的。
注意:TreeMap集合是一定要排序的,可以默认排序,也可以将键按照指定的规则进行排序。

TreeMap集合自定义排序规则有2种
1.类实现Comparable接口,重写比较规则。
2.集合自定义Comparator比较器对象,重写比较规则。

TreeMapDemo.java实现类

package d9_map_impl;
import com_collection_set.Apple;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class TreeMapDemo {
    public static void main(String[] args) {
        Map<Integer,String> maps1 = new TreeMap <>();
        maps1.put(13, "王麻子");
        maps1.put(1, "张三");
        maps1.put(3, "李四");
        System.out.println(maps1);

        // TreeMap集合自带排序,可持续,不重复(只要大小规则认为重复),无索引
        Map<Apple,String> maps2 = new TreeMap <>();
        maps2.put(new Apple("红富士","红色",9.9,500),"四川");
        maps2.put(new Apple("青苹果","绿色",15.9,300),"广东");
        maps2.put(new Apple("绿苹果","青色",29.9,400),"江西");
        maps2.put(new Apple("黄苹果","黄色",9.8,500),"湖北");
        System.out.println(maps2);

        // 自定义比较规则
        Map<Apple,String> maps3 = new TreeMap <>(new Comparator <Apple>() {
            @Override
            public int compare(Apple o1, Apple o2) {
                return Double.compare(o2.getPrice(), o1.getPrice()); // 按照价格排序!
            }
        });
        maps3.put(new Apple("红富士","红色",9.9,500),"四川");
        maps3.put(new Apple("青苹果","绿色",15.9,300),"广东");
        maps3.put(new Apple("绿苹果","青色",29.9,400),"江西");
        maps3.put(new Apple("黄苹果","黄色",9.8,500),"湖北");
        System.out.println(maps3);
    }
}

Apple.java苹果类

package com_collection_set;

public class Apple implements Comparable<Apple>{
    private String name;
    private String color;
    private double price;
    private int weight;

    public Apple() {
    }

    public Apple(String name, String color, double price, int weight) {
        this.name = name;
        this.color = color;
        this.price = price;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                ", price=" + price +
                ", weight=" + weight +
                '}';
    }

    /**
     * 1.类自定义比较规则
     * @param o
     * @return
     */
    @Override
    public int compareTo(Apple o) {
        // 按照重量比较,会过滤重复重量
        return this.weight - o.weight;
        // 不会过滤重复重复重量
//        return this.weight - o.weight >= 0?1:-1;
    }
}

Map集合实现类特点:
1.HashMap:元素按照键是无序,不重复,无索引,值不做要求,基于哈希表(与Map体系一致)。
2.LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求,基于哈希表。
3.TreeMap:元素只能按照键排序,不重复,无索引的,值不做要求,可以做排序。

集合嵌套

案例:Map集合案例-统计投票人数
需求:
某个班级多名学生,现在需要组成秋游活动,班长提供了四个景点依次是(A、B、C、D),每个学生可以选择多个景点,请统计出最终那个景点想去的人数最多。
分析:
将80个学生选择的数据拿到程序中去,需要记住每个学生的选择情况。
定义Map集合用于存储最终统计的结果 。

package d9_map_impl;
import java.util.*;
public class MapTest {
    public static void main(String[] args) {
        // 记录每个学生选择的情况
        // 使用一个Map集合存储
        Map <String, List<String>> data = new HashMap<>();

        // 把学生选择的数据存入进去。
        List<String> selects = new ArrayList <>();
        Collections.addAll(selects, "A","C");
        data.put("snow", selects);

        List<String> selects1 = new ArrayList <>();
        Collections.addAll(selects1, "A","B","C");
        data.put("dream", selects1);

        List<String> selects2 = new ArrayList <>();
        Collections.addAll(selects2, "A","B","C","D");
        data.put("yang", selects2);
        System.out.println(data);

        // 统计每个景点选择的人数
        Map<String,Integer> infos = new HashMap <>();
        // 提取所有人选择景点的信息
        Collection<List<String>> values= data.values();
        for (List <String> value : values) {
            for (String s : value) {
                // 有没有包含这个景点
                if(infos.containsKey(s)){
                    infos.put(s, infos.get(s) + 1);
                }else {
                    infos.put(s, 1);
                }
            }
        }
        System.out.println(infos);
    }
}

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

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

相关文章

Java 基础:变量、操作符、代码块和控制流

目录 一、变量&#xff1a;Variables 1、基本数据类型 2、数组 二、操作符/运算符 Operators 三、表达式、语句和代码块 四、程序控制流 一、变量&#xff1a;Variables Java 定义了以下几种变量&#xff1a; 实例变量/成员变量&#xff08;非静态字段&#xff09;&…

Docker+NETCore系列文章(五、推送自制镜像到Docker Hub、阿里云镜像仓库)

推送镜像到Docker Hub镜像仓库 1、访问Docker Hub&#xff1a;https://hub.docker.com/&#xff0c;注册并登陆Docker。 2、使用docker pull hello-world命令拉取hello-workld镜像。 [rootVM-0-6-centos ~]# docker pull hello-world Using default tag: latest latest: Pul…

微服务架构 VS 单体架构

在软件行业&#xff0c;微服务架构是一种重要的发展趋势。这一趋势&#xff0c;不仅仅是对企业内的IT信息系统建设&#xff0c;甚至在企业向数字化转型方面&#xff0c;都有着深远的影响。微服务架构与传统的单体软件架构代表着IT产业处理软件开发方式的一个根本性转变&#xf…

【C++11】异常

&#x1f308;1.C语言传统处理错误的方式 在讲解C的异常机制之前我们先来复习一下传统的处理错误的方式。 传统的错误处理机制&#xff1a; 1.终止程序、如assert , 缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。2.返回错误码、缺陷&…

Apache POI导入导出excel文件实战

文章目录前言技术栈1、引入依赖2、导入代码实现3、导出代码实现3.1、准备导出文件模板3.2、导出代码实现4、代码实现解释5、常见问题前言 这两天公司项目业务提出需求&#xff0c;要求在前端上传excel文件然后解析展示&#xff0c;因此写篇文章记录一下实现。 技术栈 spring…

抖音小程序实践三:接口开发指南

通过官方文档可以更系统的学习到所有的接口&#xff0c;我这边罗列一下我自己用到测试过的接口供大家参考。 前端-小程序对接官方文档&#xff1a;https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/tt-get-user-info服务端-小…

个人黄金准备与须知

投资黄金可以为自己的资产保值&#xff0c;也可以福泽后人&#xff0c;因此十分符合国人传统文化特点和理财智慧。可是现在市场中可以投资黄金的平台那么多&#xff0c;投资者必须先认真“调查研究”&#xff0c;才能“去芜存菁”&#xff0c;选到值得托付的好平台。 其实投资者…

为笔记本电脑绑定公网IP随时随地BT做种完整方案(frp加v2ray配合比特彗星点亮绿灯)

BT做种需要拥有固定的IP(IPV4)和端口&#xff0c;如果想在拥有固定IP的服务端做种&#xff0c;可以直接参考前一期https://www.v2fy.com/p/2022-12-25-bt-1671963832000/ &#xff0c;如果想使用笔记本随时随地做种&#xff0c;那就需要拥有固定IP的服务器进行流量转发。 本篇…

富特科技在创业板IPO过会:计划募资约9亿元,股东包括小米等

近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;浙江富特科技股份有限公司&#xff08;下称“富特科技”&#xff09;获得创业板上市委会议审核通过。据贝多财经了解&#xff0c;富特科技于2022年6月16日在创业板递交招股书。 本次冲刺创业板上市&#xff0c;富特科…

【聆思CSK6 视觉AI开发套件试用】头肩、手势识别体验与PWM舵机控制

本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;酷电玩家 环境搭建 官方文档详细环境搭建教程&#xff1a;环境搭建 1、下载Git进行安装。 2、安装lisa zep工具&#xff0c;并初始化 CSK6…

洛谷千题详解 | P1026 [NOIP2001 提高组] 统计单词个数【C++、Java语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Java源码&#xff1a; C源码2&#xff1a; ----------------------------------------------------------------------------…

vector模板的简易实现

这篇文章&#xff0c;我们模拟一下STL里面的vector的实现。但是会简化一些内容&#xff0c;让大家能够更好的理解。模拟实现的目的不是为了更好的造轮子&#xff0c;而是为了更好的理解这些容器。 文章目录1. 成员变量2. push_back函数3. reserve函数4. pop_back函数和下标运算…

QT 多线程中使用QCanBusDevice进行PCAN通讯时,无法正常发出数据

QT 多线程中使用QCanBusDevice进行PCAN通讯时&#xff0c;无法正常发出数据 前言 我一开始的代码逻辑是&#xff0c;PCAN开启、关闭、发送、接收这些功能整合在一个工具类中&#xff0c;这个工具类的对象是在主线程创建的&#xff0c;然后我有一个要循环定时发送的功能是独立…

与企企通强强联手!哈尔斯二期数字化采购项目正式启动

近日&#xff0c;浙江哈尔斯真空器皿股份有限公司&#xff08;以下简称“哈尔斯”&#xff09;联合企企通举办二期数字化采购项目启动会&#xff0c;旨在助力哈尔斯实现采购数字化全面升级&#xff0c;提升自主品牌竞争力。会上&#xff0c;双方就该项目的建设方案、项目资源、…

铝合金表面处理废水除铝工艺

铝型材表面处理用水量大&#xff0c;产生废水多&#xff0c;废水中有害物质持续排放。如不加以处理必将污染环境。同时伴随着我国对排污量的征税&#xff0c;也会增加企业的成本和负担。因此&#xff0c;从企业的社会责任和效益两方面考虑&#xff0c;进行废水处理是必须和必要…

解决VsCode启动Vue项目报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

问题描述 最近居家办公&#xff0c;网速不太稳定&#xff0c;开会的时候网络也是断断续续的&#xff0c;今天需要拉下前端项目运行起来 在我执行npm i下载包的时候&#xff0c;我看到网络超时的错误警告就感觉不太秒。知道大概率要启动失败了 果不其然执行npm run serve的时…

窃取信息的新恶意软件通过假冒的破解网站感染使用者

©网络研究院 一种名为“RisePro”的新型信息窃取恶意软件正在通过由 PrivateLoader 按安装付费 (PPI) 恶意软件分发服务运营的虚假破解站点进行分发。 RisePro 旨在帮助攻击者从受感染的设备中窃取受害者的信用卡、密码和加密钱包。 本周Flashpoint 和 Sekoia的分析师发…

前端框架 Nuxt3 集成 Pinia

目录 一、Nuxt3集成Pinia 二、Pinia的使用 state的使用 1、基本使用及动态渲染 2、state的重置 3、批量更改state数据 getters的使用 1、getters的基本使用 2、getters传参 actions的使用 1、actions的基本使用 一、Nuxt3集成Pinia 参考官方文档&#xff1a;简介 |…

【JavaSE】常用类(447~515)

String 447.常用类-每天一考 1.画图说明线程的生命周期&#xff0c;以及各状态切换使用到的方法等 状态&#xff0c;方法 2.同步代码块中涉及到同步监视器和共享数据&#xff0c;谈谈你对同步监视器和共享数据的理解&#xff0c;以及注意点。 synchronized(同步监视器){//操…

消息队列RabbitMQ学习笔记(五)高级特性

1. 发布确认高级 在生产环境中由于一些不明原因&#xff0c;导致 RabbitMQ 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投…