首页 > 其他分享 >Map集合体系大介绍

Map集合体系大介绍

时间:2024-06-13 11:28:56浏览次数:19  
标签:体系 Map HashMap map System put 集合 println

1.Map集合体系

Map集合体系概述(Map系列集合的特点都是由键决定的,值只是一个附属品,值是不做要求的):
在Map接口下,主要有两个实现类HashMap(LinkedHashMap是在HashMap基础上的另一个实现类)和TreeMap实现类。

  • HashMap(由键决定特点):无序、不重复、无索引
    • 用的最多(利用hashCode和equals计算存储位置)
  • LinkedHashMap(由键决定特点):有序、不重复、无索引
    • (利用hashCode和equals计算存储位置)在前者的基础上,加Linked,底层用双向链表维护集合元素存储的顺序
  • HashMap(由键决定特点):按照大小默认升序排序、不重复、无索引
    • TreeSet一般的必须要有排序规则,才能进行访问遍历

如果存储的只是基本类型:Integer或Double,默认排序便可以解决,这种可以直接访问
如果是引用类型的数据类型,程序便不能再直接去别出顺序,此时便必须重写排序规则,否则访问即报错
在这里插入图片描述

2.Map常用API

代码编译环境:JDK11
package My1_Map;

import java.util.*;


/**
 * Map接口的集合,常用API
 */
public class Test0_Map_Methods {
    public static void main(String[] args) {

        /**
         * 方法1:V put(K key, V value):添加键值对数据
         *       1、当添加的键不存在时,添加成功,返回null
         *       2、当添加的键存在是,会使用新值替换旧值,并返回旧值(相当于是修改方法)
         */
        Map<String,String> map = new HashMap<>();
        String put = map.put("法外狂徒", "张三");
        System.out.println(put);
        String put1 = map.put("法外狂徒", "李四");
        System.out.println(put1);

        map.put("雷电法王","杨永信");
        map.put("沉鱼落雁","罗玉凤");

        /**
         * 方法2:int size():获取集合的键值对的对象个数
         */
        System.out.println(map);//这里我们先看一下目前map集合中的元素
        int size = map.size();
        System.out.println("size =" + size);

        /**
         * 方法3:void clear():清空集合
         */
        map.clear();
        System.out.println("map =" + map);

        /**
         * 方法4:boolean isEmpty():判断集合是否为空
         */
        boolean empty = map.isEmpty();
        System.out.println(empty);

        // 重新添加几条数据
        map.put("东邪","黄药师");
        map.put("西毒","欧阳锋");
        map.put("南帝","一灯大师");
        map.put("北丐","洪七公");
        map.put("中神通","周伯通");
        map.put("XX","YY");

        /**
         * 方法5:V get(Object key):根据键获取对应值
         *       1、键存在,返回键对应的值
         *       2、键不存在,返回null
         */
        String key1 = "西毒";
        String exist = map.get("key1");
        System.out.println("exist(" + key1 + "的名字为):" + exist);
        String notExist = map.get("加拿大电鳗");
        System.out.println("notExist不存在的值结果:" + notExist);

        /**
         * 方法6:V remove(Object key):删除键对应的键值对,返回被删除的键值对中的值
         *       1、键存在时:返回键对应的值
         *       2、键不存在时:返回null
         */
        String remove1 = map.remove("XX");
        System.out.println("remove1 = " + remove1);
        String remove2 = map.remove("加拿大电鳗");
        System.out.println("remove1 = " + remove2);//不存在 “加拿大电鳗” 这个键,所以返回 null

        /**
         * 方法7:boolean containsKey(Object key):判断集合是否包含某个键(键是唯一的,相当于是精确查找)
         *       1、键存在时:返回true
         *       2、键不存在时:返回false
         */
        boolean containsKey1 = map.containsKey("西毒");
        System.out.println("containsKey1 = " + containsKey1);//true
        boolean containsKey2 = map.containsKey("XXX");
        System.out.println("containsKey2 = " + containsKey2);//false

        /**
         * 方法8:boolean containsValue(Object value):判断是否包含某个值
         */
        boolean containsValue1 = map.containsValue("罗志祥");
        System.out.println("containsValue1 = " + containsValue1);//包含,返回true
        boolean containsValue2 = map.containsValue("罗玉凤");
        System.out.println("containsValue2 = " + containsValue2);//不包含,返回false

        /**
         * 方法9:Set<K> keySet():获取Map集合 所有的键(Key),存储到Set集合中
         */
        Set<String> keys = map.keySet();
        System.out.println("keys = " + keys);

        /**
         * 方法10:Collection<V> values():获取Map集合 所有的值(value),存储到Collection集合中)
         */
        Collection<String> values = map.values();
        System.out.println("values = " + values);

        /**
         * 方法11:public void putAll(Map<? extends K, ? extends V> m)
         *       将 B map中的所有键值对 添加到 A map中
         *       1、如果A map中的键值对,在B map中已经存在,那么就修改B map中键对应的值
         *       2、如果A map中的键值对,在B map中不存在,那么就添加到B map中
         */
        HashMap<String, String> map1 = new HashMap<>();
        map1.put("数学","Math");
        map1.put("物理","Physics");
        map1.put("化学","Chemistry");
        HashMap<String, String> map2 = new HashMap<>();
        map2.put("语文","Chinese");
        map2.put("英语","English");
        map2.put("数学","ShuXue");
        map1.putAll(map2);
        System.out.println("map1 = " + map1);
        System.out.println("map2 = " + map2);
    }
}

package My1_Map;

import java.util.*;
import java.util.function.BiConsumer;

/**
 * Map集合,遍历方式
 *    1.键找值
 *    2.键值对
 *          2.1 迭代器遍历
 *          2.2 增强for遍历
 *          2.3 Lambda遍历
 *    3.获取所有值
 */
public class Test0_Map_Methods2 {
    public static void main(String[] args) {

        HashMap<String, String> map = new HashMap<>();
        map.put("东邪","黄药师");
        map.put("西毒","欧阳锋");
        map.put("南帝","一灯大师");
        map.put("北丐","洪七公");
        map.put("中神通","周伯通");

        /**
         * 遍历方式1:键找值:先通过 Map 获取所有键的 集合,然后 对键的集合 遍历get到对应键的值,然后打印
         *           步骤一:
         *               方法:获取所有键的集合
         *               构造:Set<K> keySet()
         *           步骤二:
         *               方法:根据键获取其对应的值
         *               构造:V get(Object key)
         */
        Set<String> keys = map.keySet();
        for (String key : keys) {
            String value = map.get(key);
            System.out.println("绰号:" + key + ",姓名:" + value);
        }

        /**
         * 遍历方式2:键值对:获取到所有键值对的集合,然后遍历,调用 键值对entrySet的 api,获取 键和值,然后打印
         *           步骤一:
         *               方法:Set<Map.Entry<K,V>> entrySet():获取所有键值对的集合
         *               当我们调用entrySet()方法,entrySet()底层就会将集合中的键和值,封装成一个Entry对象,
         *               Entry对象的对象类型,即Map的Entry类型,Entry对象的属性为(键,值),然后底层将这些封装的Entry对象放到一个Set集合中返回一个Map.Entry<泛型1, 泛型2>类型的集合给调用者
         *           步骤二:
         *               方法:获取键
         *               构造:K getKey()
         *               方法:获取值
         *               构造:V getValue()
         */
        Set<Map.Entry<String, String>> entries = map.entrySet();
        // 2.1 迭代器遍历
        Iterator<Map.Entry<String, String>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("绰号:" + key + ",姓名:" + value);
        }
        // 2.2 增强for遍历
        for (Map.Entry<String, String> entry : entries) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("绰号:" + key + ",姓名:" + value);
        }
        // 2.3 Lambda遍历
        //     default void forEach(BiConsumer<? super K,? super V> action)
        //     底层原理:通过迭代器,获取键值对对象,再通过键值对对象,直接获取 键 和 值 ,然后传给accept(键,值)
        map.forEach((key, value) -> System.out.println("绰号:" + key + ",姓名:" + value));

        /**
         * 遍历方式3:获取所有值
         */
        Collection<String> values = map.values();
        for (String value : values) {
            System.out.println(value);
        }
    }
}

3.HashMap demo

package My1_Map;

import My1_Map.pojo.Student;
import My1_Map.pojo.Teacher;

import java.util.HashMap;
import java.util.function.BiConsumer;

/**
 * HashMap集合
 *     特点:
 *          1、无序、不重复、无索引
 *          2、HashSet的底层是HashMap
 *          3、HashMap底层数据结构是哈希表
 *          4、HashMap存储自定义对象作为键,为了保证键的唯一性(去重),需要重写hashCode()以及equals()方法
 *
 *      · HashMap集合是一种增删改查数据,性能都较好的集合
 *      · 但是它是无序、不能重复、没有索引支持的(由键决定特点,(值是可以重复的))
 *      · HashMap的键依赖hashCode方法和equals方法来保证键的唯一
 *      · 如果键存储的是自定义类型的对象,可以通过重写hashCode方法和equals方法,这样可以保证多个对象内容一样时,HashMap集合就能认为是重复的,不再存储
 *
 *      HashMap集合的底层原理:
 *          HashSet跟HashSetd的底层原理是一模一样的,都是基于哈希表实现的(根据哈希值%数组取余求出应该存储的位置)
 *          实际上:原来学的Set系列集合的底层就是基于Map实现的,是指Set集合中的元素,只要键数据,不要值数据而已
 */
public class Test1_HashMap {
    public static void main(String[] args) {
        /**
         * HashMap键的唯一 demo(不重写hashCode()以及equals()方法)
         *      1.使用自定义对象 Teacher 作为键
         *      2.字符串 作为值
         *      3.Teacher没有重写 hashCode()以及equals()方法
         * 结论:
         *      创建同属性的 Teacher 对象,添加到 HashMap集合中,因为没有重写 hashCode()以及equals()方法,所以都可以添加到 集合中
         */
        HashMap<Teacher, String> teacherStringHashMap = new HashMap<>();
        teacherStringHashMap.put(new Teacher("张三",25),"南京");
        teacherStringHashMap.put(new Teacher("张三",25),"北京");
        teacherStringHashMap.put(new Teacher("张三",25),"上海");
        teacherStringHashMap.put(new Teacher("张三",25),"深圳");
        teacherStringHashMap.forEach((key,value) -> System.out.println("姓名:" + key + ",城市:" + value));


        System.out.println("----------------------");

        /**
         * HashMap键的唯一 demo(重写hashCode()以及equals()方法)
         *      1.使用自定义对象 Student 作为键
         *      2.字符串 作为值
         *      3.Student重写 hashCode()以及equals()方法
         * 结论:
         *      创建同属性的 Teacher 对象,添加到 HashMap集合中,因为重写 hashCode()以及equals()方法,所以只有一个被添加到 集合中,因为键的唯一性
         *
         * 为什么重写 hashCode()以及equals()方法,才能保证键的唯一性?
         *      未重写,hashmap的键唯一性检验时,调用的是 Object 的 equals 和 hashcode方法(比较的是引用地址是否相同)
         *      重写后,hashmap的键唯一性检验时,调用的是 Student 的 equals 和 hashcode方法(比较的是属性值是否相同)
         */
        HashMap<Student, String> studentStringHashMap = new HashMap<>();
        studentStringHashMap.put(new Student("张三",25),"南京");
        studentStringHashMap.put(new Student("张三",25),"北京");
        studentStringHashMap.put(new Student("张三",25),"上海");
        studentStringHashMap.put(new Student("张三",25),"深圳");
        studentStringHashMap.forEach((key,value) -> System.out.println("姓名:" + key + ",城市:" + value));
    }
}

4.LinkedHashMap demo

package My1_Map;

import My1_Map.pojo.Student;

import java.util.LinkedHashMap;
import java.util.function.BiConsumer;

/**
 * LinkedHashMap集合
 *      特点:
 *          有序、不重复、无索引
 *
 *      底层通过双向链表维护键的存储顺序
 *
 *      要使用对象作为键,必须重写equals()方法和hashCode()方法
 *
 *      LinkedHashMap集合的底层原理:
 *      底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外多了一个双链表的机制记录元素的顺序(这样来保证我们存入的先后顺序,在打印的时候也是按照该顺序打印出来)
 *      实际上:原来学习的LinkedHashSet集合的底层原理就是LinkedHashMap
 */
public class Test2_LinkedHashMap {
    public static void main(String[] args) {
        LinkedHashMap<Student, String> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put(new Student("张三",20),"云南");
        linkedHashMap.put(new Student("李四",21),"缅甸");
        linkedHashMap.put(new Student("李四",21),"缅甸");
        linkedHashMap.put(new Student("赵六",23),"老挝");
        linkedHashMap.put(new Student("赵六",23),"老挝");
        linkedHashMap.forEach((key,value) -> System.out.println("姓名:" + key + ",城市:" + value));
    }
}


5.TreeMap demo

package My1_Map;

import My1_Map.pojo.Student;

import java.util.Comparator;
import java.util.TreeMap;
import java.util.function.BiConsumer;

/**
 * TreeMap集合
 *      特点:不重复,无索引,可排序(按照键的大小默认升序排序,只能对键排序, 不能对值排序, 维护键的有序性基于 对象是否实现Comparable接口或重写compareTo方法)
 *           1、底层结构是红黑树
 *           2、TreeSet底层就是TreeMap
 *           3、添加自定义对象作为键需要指定排序规则
 *               自然排序:自定义对象所属类需要实现Comparable接口,重写compareTo方法
 *               比较器排序:在TreeMap集合构造方法中传递Comparator比较器对象,重写compareTo方法
 *               注意:比较器规则优先级 > 自然排序规则
 *
 *      底层原理:TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序
 *               TreeMap集合同样也支持两种方式来指定排序规则
 *                      1、让类实现Comparable接口,重写比较规则
 *                      2、TreeMap集合有一个有参数构造器,支持创建Comparator比较器对象,一遍用来指定比较规则
 */
public class Test3_TreeMap {
    public static void main(String[] args) {
        TreeMap<Student, String> treeMap = new TreeMap<>();
        treeMap.put(new Student("张三",20),"云南");
        treeMap.put(new Student("李四",21),"缅甸");
        treeMap.put(new Student("李四",21),"缅甸");
        treeMap.put(new Student("赵六",23),"老挝");
        treeMap.put(new Student("赵六",23),"老挝");
        treeMap.forEach((key, value) -> System.out.println("姓名:" + key + ",城市:" + value));
    }
}

标签:体系,Map,HashMap,map,System,put,集合,println
From: https://blog.csdn.net/Mr_chen199409/article/details/139640984

相关文章

  • 渗透测试工具NMAP
    nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。Nmap包含三项基本功能:(1)是扫描主机端口,嗅探所提供的网络服......
  • MapStruct - 注解汇总
    @Mapper@Mapper将接口或抽象类标记为映射器,并自动生成映射实现类代码。public@interfaceMapper{//引入其他其他映射器Class<?>[]uses()default{};//将类import到生成的实现类中//可以使用{@linkmapping#expression()}表达式中引用这些类型,{@link......
  • golang执行语句操作与map结构体变量调用函数
    本文记录利用golang调用exe文件。需要用到包os/exec,本文重点介绍如何利用golang执行带参数的可执行文件以及踩过的坑。首先c:=exec.Command(cmd)语句不会执行cmd命令,而是做好要执行的准备,当接下来调用c.Run()时才会执行cmd命令,注意到此时是会阻塞进程的,等待执行完成才会进行下一......
  • c++哈希表hash_table的深度学习(hash_map,un和hash_set的底层实现)
    什么是哈希表?哈希表(HashTable)是一种数据结构,它使用哈希函数将键(key)映射到桶(bucket)或槽(slot)中,可以直接通过相应的键值直接对数据进行访问,高效的插入,删除,查找 哈希表的组成部分和特性哈希函数:哈希函数接受一个键作为输入,并返回一个索引值(通常是一个整数),该索引值用于确定键......
  • golang sync.Map 与使用普通的 map 的区别
     使用sync.Map与普通的Gomap主要有以下几点区别:1.并发安全性普通map:在没有外部同步的情况下,不是并发安全的。在多goroutine访问时,如果没有适当的锁或其他同步机制保护,可能会导致数据竞争和未定义行为。sync.Map:是并发安全的。它内部实现了必要的同步机制,允许多......
  • 设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量
    设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互斥访问。提示:进程A、进程B、进程C需要使......
  • Java集合总结
    JAVA中常见的集合总结使用集合的好处:可以动态的保存任意多个对象,使用比较方便提供了一些列方便的操作对象的方法:add,remove,set,get等使用集合添加,删除元素的示意代码简洁明了集合主要分为两种:单列集合:集合中存放的是单个对象双列集合:集合中存放的是键值对对象C......
  • 【K8s】专题五(1):Kubernetes 配置之 ConfigMap
    以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号!目录一、基本介绍二、主要特性三、资源清单(示例)四、常用操作一、基本介绍在Kubernetes中,ConfigMap是一种用于存储非敏感信息的资源对象,提供了向Pod......
  • mybatis的mapper中的sql涉及嵌套且外部引用导致的问题:XML fragments parsed from prev
    假设xxx.xml中有类似下方的sql嵌套:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.xx......
  • mybatis-plus加载多个module的mapper踩坑记录
    背景 有一个多模块的项目,每个模块中都有自己的mapper.xml文件。但是在执行一次SQL查询中,mybatis却报出了下面的异常 排查过程第一步,先检查mapper扫描是否正确 先找到这个方法的位置 可以看到包名是com.pinming.security.responsibility.mapper 检查SpringBoot......