• Map集合概述和一般使用


    1.Map集合

    1.1Map集合概述和特点【理解】

    • Map集合概述

    • Map代表具有映射关系(key-value)的集合。

      interface Map<K,V>  K:键的类型;V:值的类型
      
      • 1
    • Map集合的特点

      • 双列集合,一个键对应一个值

      • 键不可以重复,值可以重复

        image-20220919114841431

      注:紫色框体代表接口,其中加粗的是代表四类集合的接口。蓝色框体代表实现类,其中有阴影的是常用实现类。

    扩展

    Map接口的实现类:

    Map接口有很多实现类,其中比较常用的有HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap。
    对于不需要排序的场景,优先考虑使用HashMap,因为它是性能最好的Map实现。如果需要保证线程安全,则可以使用ConcurrentHashMap。它的性能好于Hashtable,因为它在put时采用分段锁/CAS的加锁机制,而不是像Hashtable那样,无论是put还是get都做同步处理。
    对于需要排序的场景,如果需要按插入顺序排序则可以使用LinkedHashMap,如果需要将key按自然顺序排列甚至是自定义顺序排列,则可以选择TreeMap。如果需要保证线程安全,则可以使用Collections工具类将上述实现类包装成线程安全的Map。
    • Map集合的基本使用

      public class MapDemo01 {
          public static void main(String[] args) {
              //创建集合对象
              Map<String,String> map = new HashMap<String,String>();
              //V put(K key, V value) 将指定的值与该映射中的指定键相关联
              map.put("itheima001","林青霞");
              map.put("itheima002","张曼玉");
              map.put("itheima003","王祖贤");
              map.put("itheima003","柳岩");
              //输出集合对象
              System.out.println(map);
          }
      }
      
      Map put的过程
      HashMap是最经典的Map实现,下面以它的视角介绍put的过程:
      1.	首次扩容:
      先判断数组是否为空,若数组为空则进行第一次扩容(resize);
      2.	计算索引:
      通过hash算法,计算键值对在数组中的索引;
      3.	插入数据:
      o	如果当前位置元素为空,则直接插入数据;
      o	如果当前位置元素非空,且key已存在,则直接覆盖其value;
      o	如果当前位置元素非空,且key不存在,则将数据链到链表末端;
      o	若链表长度达到8,则将链表转换成红黑树,并将数据插入树中;
      4.	再次扩容
      如果数组中元素个数(size)超过threshold,则再次进行扩容操作。
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28

    1.2Map集合的基本功能【应用】

    • 方法介绍

      方法名说明
      V put(K key,V value)添加元素
      V remove(Object key)根据键删除键值对元素
      void clear()移除所有的键值对元素
      boolean containsKey(Object key)判断集合是否包含指定的键
      boolean containsValue(Object value)判断集合是否包含指定的值
      boolean isEmpty()判断集合是否为空
      int size()集合的长度,也就是集合中键值对的个数
    • 示例代码

      public class MapDemo02 {
          public static void main(String[] args) {
              //创建集合对象
              Map<String,String> map = new HashMap<String,String>();
      
              //V put(K key,V value):添加元素
              map.put("张无忌","赵敏");
              map.put("郭靖","黄蓉");
              map.put("杨过","小龙女");
      
              //V remove(Object key):根据键删除键值对元素
      //        System.out.println(map.remove("郭靖"));
      //        System.out.println(map.remove("郭襄"));
      
              //void clear():移除所有的键值对元素
      //        map.clear();
      
              //boolean containsKey(Object key):判断集合是否包含指定的键
      //        System.out.println(map.containsKey("郭靖"));
      //        System.out.println(map.containsKey("郭襄"));
      
              //boolean isEmpty():判断集合是否为空
      //        System.out.println(map.isEmpty());
      
              //int size():集合的长度,也就是集合中键值对的个数
              System.out.println(map.size());
      
              //输出集合对象
              System.out.println(map);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31

    1.3Map集合的获取功能【应用】

    • 方法介绍

      方法名说明
      V get(Object key)根据键获取值
      Set keySet()获取所有键的集合
      Collection values()获取所有值的集合
      Set> entrySet()获取所有键值对对象的集合
    • 示例代码

      public class MapDemo03 {
          public static void main(String[] args) {
              //创建集合对象
              Map<String, String> map = new HashMap<String, String>();
      
              //添加元素
              map.put("张无忌", "赵敏");
              map.put("郭靖", "黄蓉");
              map.put("杨过", "小龙女");
      
              //V get(Object key):根据键获取值
      //        System.out.println(map.get("张无忌"));
      //        System.out.println(map.get("张三丰"));
      
              //Set keySet():获取所有键的集合
      //        Set keySet = map.keySet();
      //        for(String key : keySet) {
      //            System.out.println(key);
      //        }
      
              //Collection values():获取所有值的集合
              Collection<String> values = map.values();
              for(String value : values) {
                  System.out.println(value);
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27

    1.4Map集合的遍历(方式1)【应用】

    • 遍历思路

      • 我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合
        • 把所有的丈夫给集中起来
        • 遍历丈夫的集合,获取到每一个丈夫
        • 根据丈夫去找对应的妻子
    • 步骤分析

      • 获取所有键的集合。用keySet()方法实现
      • 遍历键的集合,获取到每一个键。用增强for实现
      • 根据键去找值。用get(Object key)方法实现
    • 代码实现

      public class MapDemo01 {
          public static void main(String[] args) {
              //创建集合对象
              Map<String, String> map = new HashMap<String, String>();
      
              //添加元素
              map.put("张无忌", "赵敏");
              map.put("郭靖", "黄蓉");
              map.put("杨过", "小龙女");
      
              //获取所有键的集合。用keySet()方法实现
              Set<String> keySet = map.keySet();
              //遍历键的集合,获取到每一个键。用增强for实现
              for (String key : keySet) {
                  //根据键去找值。用get(Object key)方法实现
                  String value = map.get(key);
                  System.out.println(key + "," + value);
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20

    1.5Map集合的遍历(方式2)【应用】

    • 遍历思路

      • 我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合
        • 获取所有结婚证的集合
        • 遍历结婚证的集合,得到每一个结婚证
        • 根据结婚证获取丈夫和妻子
    • 步骤分析

      • 获取所有键值对对象的集合
        • Set> entrySet():获取所有键值对对象的集合
      • 遍历键值对对象的集合,得到每一个键值对对象
        • 用增强for实现,得到每一个Map.Entry
      • 根据键值对对象获取键和值
        • 用getKey()得到键
        • 用getValue()得到值
    • 代码实现

      public class MapDemo02 {
          public static void main(String[] args) {
              //创建集合对象
              Map<String, String> map = new HashMap<String, String>();
      
              //添加元素
              map.put("张无忌", "赵敏");
              map.put("郭靖", "黄蓉");
              map.put("杨过", "小龙女");
      
              //获取所有键值对对象的集合
              Set<Map.Entry<String, String>> entrySet = map.entrySet();
              //遍历键值对对象的集合,得到每一个键值对对象
              for (Map.Entry<String, String> me : entrySet) {
                  //根据键值对对象获取键和值
                  String key = me.getKey();
                  String value = me.getValue();
                  System.out.println(key + "," + value);
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

    p.Entry me : entrySet) {
    //根据键值对对象获取键和值
    String key = me.getKey();
    String value = me.getValue();
    System.out.println(key + “,” + value);
    }
    }
    }

    
    
    • 1
  • 相关阅读:
    【Java】泛型方法
    Java之File类的详细解析及小练习
    Vue中的侦听器 Watch
    【学习笔记】EC-Final 2022 K. Magic
    【单目3D目标检测】SMOKE + MonoFlex 论文解析与代码复现
    Java学习Day029(继承和super关键字)
    uni-app(微信小程序)图片旋转放缩,文字绘制、海报绘制
    【机器学习】手写数字识别
    Java开发学习---Maven私服(二)本地仓库访问私服配置与私服资源上传下载
    QT::QString 很全的使用
  • 原文地址:https://blog.csdn.net/weixin_56462645/article/details/126931090