• 【Java集合框架】18——Map接口


    一、Map接口的介绍

    map 接口 位于 java.utils 包下, 表示键和值之间的映射。map以键为基础包含值,即键和值对。每个键和值对都称为一个条目。Map包含唯一的键。
    如果您必须基于一个键来搜索、更新或删除元素,那么Map非常有用。

    Map 接口 层次结构
    在java中有两个实现Map的接口:Map和SortedMap,以及三个类:HashMap、LinkedHashMap和TreeMap
    Java Map的层次结构如下:

    在这里插入图片描述

    Map不允许重复的键,但是可以有重复的值。HashMap和LinkedHashMap允许空键和值,但TreeMap不允许任何空键或值。

    Map 非常适合用于键-值关联映射,比如字典。这些Map用于按键执行查找,或者当有人想按键检索和更新元素时使用。
    常见场景如下:

    • 错误码及其描述的map。
    • 有邮政编码和城市的map。
    • 经理和员工的map。每个经理(键)都与他管理的员工(值)列表相关联。
    • 班级和学生的map。每个类(键)与一个学生列表(值)相关联

    Map 接口 创建对象
    因为Map是一个接口,所以不能使用类型映射创建对象。为了创建对象,我们总是需要一个扩展这个映射的类。而且,在Java 1.5中引入泛型之后,可以限制可以存储在Map中的对象的类型。

    Map hm = new HashMap(); 
    
    • 1

    Map接口的特性

    • Map不能包含重复的键,每个键最多只能映射到一个值。有些实现允许空键和空值,比如HashMap和LinkedHashMap,但有些不喜欢TreeMap。
    • 映射的顺序取决于具体的实现。例如,TreeMap和LinkedHashMap有可预测的顺序,而HashMap没有。
    • 有两个接口用于在java中实现Map。它们是Map和SortedMap,以及三个类:HashMap、TreeMap和LinkedHashMap。

    二、Map接口的操作

    因为Map是一个接口,所以它只能与实现该接口的类一起使用。现在,让我们看看如何使用广泛使用的HashMap类在Map上执行一些经常使用的操作。而且,在Java 1.5中引入泛型之后,可以限制可以存储在映射中的对象的类型。

    使用Map接口和HashMap类执行各种操作

    2.1 添加操作

    为了向映射添加元素,可以使用put()方法。但是,hashmap中不保留插入顺序。在内部,为每个元素生成一个单独的散列,并基于这个散列对元素进行索引,以提高效率。

    实例:

        public static void main(String[] args) {
            Map<Integer, String> hm1 = new HashMap<>();
    
            // 使用泛型初始化Map
            Map<Integer, String> hm2 = new HashMap<Integer, String>();
    
            // 插入元素
            hm1.put(1, "深圳");
            hm1.put(2, "广州");
            hm1.put(3, "惠州");
            hm1.put(3, "惠州2");  // 键不能重复,值会覆盖
    
            hm2.put(new Integer(1), "江门");
            hm2.put(new Integer(2), "香港");
            hm2.put(new Integer(3), "佛山");
    
            System.out.println(hm1);
            System.out.println(hm2);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出:
    {1=深圳, 2=广州, 3=惠州2}
    {1=江门, 2=香港, 3=佛山}

    2.2 修改操作

    添加元素之后,如果我们希望更改元素,可以使用put()方法再次添加元素。由于映射中的元素是使用键建立索引的,因此键的值可以通过简单地插入我们想要更改的键的更新值来更改。

    实例:

        public static void main(String[] args) {
            Map<Integer, String> hm1 = new HashMap<>();
    
            hm1.put(new Integer(1), "江门");
            hm1.put(new Integer(2), "香港");
            hm1.put(new Integer(3), "佛山");
    
            System.out.println("初始Map" + hm1);
    
            hm1.put(new Integer(2),"海南");
    
            System.out.println("修改map 后"+hm1);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    输出:
    初始Map{1=江门, 2=香港, 3=佛山}
    修改map 后{1=江门, 2=海南, 3=佛山}

    2.3 删除操作

    为了从Map中删除一个元素,我们可以使用remove()方法。此方法获取键值,并从该映射中移除某个键的映射(如果该键在映射中存在)。

    实例:

        public static void main(String[] args) {
            Map<Integer, String> hm1 = new HashMap<>();
    
            hm1.put(new Integer(1), "江门");
            hm1.put(new Integer(2), "香港");
            hm1.put(new Integer(3), "佛山");
    
            System.out.println("初始Map" + hm1);
    
            hm1.remove(2);
    
            System.out.println("删除map 后"+hm1);
        }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出:

    初始Map{1=江门, 2=香港, 3=佛山}
    删除map 后{1=江门, 3=佛山}
    
    
    • 1
    • 2
    • 3

    2.4 迭代操作

    有多种方法可以遍历Map。最著名的方法是使用for-each循环来获取键。键的值是通过使用getValue()方法找到的。

    实例:

        public static void main(String[] args) {
            Map<Integer, String> hm1 = new HashMap<>();
    
            hm1.put(new Integer(1), "江门");
            hm1.put(new Integer(2), "香港");
            hm1.put(new Integer(3), "佛山");
    
            System.out.println("初始Map" + hm1);
    
            for (Map.Entry mapElement : hm1.entrySet()) {
                // 获取键
                int key = (int)mapElement.getKey();
    
                // 获取值
                String value = (String)mapElement.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

    输出:

    初始Map{1=江门, 2=香港, 3=佛山}
    1 : 江门
    2 : 香港
    3 : 佛山
    
    • 1
    • 2
    • 3
    • 4

    三、Map接口的API

    MethodDescription
    V put(Object key, Object value)它用于在映射中插入条目。
    void putAll(Map map)它用于在映射中插入指定的映射。
    V putIfAbsent(K key, V value)只有当指定的值没有被指定时,它才会将指定的值与指定的键一起插入到映射中。
    V remove(Object key)用于删除指定键的条目。
    boolean remove(Object key, Object value)它从映射中删除具有关联的指定键的指定值。
    Set keySet()它返回包含所有键的Set视图。
    Set> entrySet()它返回包含所有键和值的Set视图。
    void clear()它用于重置map
    V compute(K key, BiFunction remappingFunction)它用于计算指定键及其当前映射值的映射(如果没有当前映射,则为null)。
    V computeIfAbsent(K key, Function mappingFunction)如果指定的键尚未与值关联(或映射为空),则使用给定的映射函数计算其值,并将其输入到这个映射中,除非为空
    V computeIfPresent(K key, BiFunction remappingFunction)它用于计算给定键及其当前映射值的新映射,如果指定键的值存在且非空。
    boolean containsValue(Object value)如果映射中存在与该值相等的值,则此方法返回true,否则返回false。
    boolean containsKey(Object key)如果映射中存在与该键相等的键,则此方法返回true,否则返回false。
    boolean equals(Object o)它用于比较指定的对象和映射。
    void forEach(BiConsumer action)它对映射中的每个条目执行给定的操作,直到处理完所有条目,或者该操作抛出异常。
    V get(Object key)此方法返回包含与键关联的值的对象。
    V getOrDefault(Object key, V defaultValue)它返回指定键映射到的值,如果映射不包含该键的映射,则返回defaultValue。
    int hashCode()它返回Map的散列代码值
    boolean isEmpty()如果映射为空,此方法返回true;如果包含至少一个键,则返回false。
    V merge(K key, V value, BiFunction remappingFunction)如果指定的键没有与值关联或与null关联,则将其与给定的非空值关联。
    V replace(K key, V value)它将替换指定键的指定值。
    boolean replace(K key, V oldValue, V newValue)它将指定键的旧值替换为新值。
    void replaceAll(BiFunction function)它将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理完或该函数抛出异常。
    Collection values()它返回映射中包含的值的集合视图。
    int size()此方法返回映射中的条目数。
  • 相关阅读:
    Tomcat下载安装及配置Https教程
    java 中的Object类与Objects类
    [架构之路-51]:架构师 - 用系统化、结构化思维解决复杂难搞的软件故障问题 - 马克思主义哲学在软件系统中的应用
    FAN7391MX 高压600V 用于高压、高速驱动 MOSFET和IGBT 半桥栅极驱动器IC
    Towards a General Purpose CNN for Long Range Dependencies in ND
    进程和线程ID
    JVM的主要组成及其作用
    NVIDIA Jetson TX2 解决奥比中光 Astra pro相机的ros 打不开深度信息/camera/depth/image
    ES集群&kibana安装
    进程的概念和分类
  • 原文地址:https://blog.csdn.net/weixin_44735928/article/details/126203561