java 双列集合Map 万字详解

举报
Cyan_RA9 发表于 2023/05/04 16:04:45 2023/05/04
【摘要】 java 集合篇章——Map集合总结。

目录

一、前言

二、概述

三、特点

四、常用方法

        1. V put(K key, V value) :

                Δ代码演示 : 

        2. V get(Object key) :

                Δ代码演示 : 

        3. V remove(Object key) :

                Δ代码演示 : 

        4. int size() :

                Δ代码演示 : 

        5. default V replace(K key, V value) : 

                Δ代码演示 : 

        6. boolean isEmpty() : 

                Δ代码演示 : 

        7. void clear() : 

                Δ代码演示 : 

        8. boolean containsKey(Object key) : 

                Δ代码演示 : 

        9. Set keySet() : 

                Δ代码演示 : 

五、 Map集合的遍历

        0.前言 : 

        1.方式一 —— 通过keySet方法和get方法

                ①步骤 : 

                ②代码演示 : 

        2.方式二 —— 通过values方法

                ①步骤 : 

                ②代码演示 :  

        3.方式三 —— 通过entrySet方法

                ①步骤 : 

                ②代码演示 :  

六、HashMap源码解读(深度讲解)

七、Hashtable及其子类Properties源码解读

八、TreeMap源码解读

九、完结撒❀


一、前言

        大家好,本篇博文是对集合框架中的双列集合——Map集合的一个深度总结主要内容包括了Map集合的介绍、特点、常用方法演示、遍历方式,以及Map接口的几个常用实现类——HashMap,Hashtable,TreeMap的源码分析

        注意 : 代码中的注释也很重要;不要眼高手低,自己跟着过一遍才算有收获;点击文章的侧边栏目录或者文章开头的目录可以进行跳转。良工不示人以朴,所有文章都会适时补充完善。大家如果有问题都可以在评论区进行交流或者私信up。感谢阅读!


二、概述

        Map接口与Collection接口并列存在,与Collection系列的单列集合相对,Map是双列集合,用于保存具有映射关系的数据Key-Value(键值对)

        Map接口也属于java.base模块,java.util包下,如下图所示 : 

image.png

        再来回顾一下Map集合体系的类图,如下

image.png

        可以看到,Map接口常用的实现类有三个——Hashtable, HashMap, 和TreeMap,并且还有两个常用实现类Properties和LinkedHashMap分别是Hashtable和HashMap的子类


三、特点

        Map集合中的元素由key-value键值对(Entry)构成,其中key和value可以由任意引用类型的键值对构成,会封装到HashMap$Node对象中

        键值对中的key不可重复(底层同HashSet),但是value可以重复。所以,当key或者value为null时,key只能有一个是null,而value可以有多个是null。

        键值对中的key常用String类型来表示

        key和value之间存在一一映射关系,即总可以通过指定的key来找到其对应的value。

        一个key-value键值对存放在一个HashMap$Node类型的对象中。(HashMap中的Node内部类实现了Map接口中的Entry内部接口)


四、常用方法

        1. V put(K key, V value) :

                该方法以键值对的形式向集合中添加元素,首次添加某元素时,返回null;重复添加相同键的元素时,新值覆盖旧值,并返回旧值

                Δ代码演示 : 

                up以Methods类为演示类,代码如下 : 

package csdn.knowledge.api_tools.gather.map;
import java.util.HashMap;
import java.util.Map;
public class Methods {
    public static void main(String[] args) {
    //演示 : Map集合的常用方法
        Map map = new HashMap();
        //1.V put(K key, V value) : 以键值对的形式向集合中添加元素
            /*
                首次添加某元素时,返回null;
                重复添加相同键的元素时,新值覆盖旧值,并返回旧值
             */
            Object o = map.put("916", "计算机网络和数据结构");
            System.out.println(o);
            Object o2 = map.put("916", "数据结构和计算机网络");
            System.out.println(o2);
            map.put("935", "数据结构,操作系统和计组");
            map.put("872", "数据结构和操作系统");
            System.out.println(map);
    }
}

image.gif

                运行结果 : 

image.png

        2. V get(Object key) :

                该方法可以获取到集合中指定键所对应的值,若没有则返回null

                Δ代码演示 : 

                up仍以Methods类为演示类,代码如下 : 

package csdn.knowledge.api_tools.gather.map;
import java.util.HashMap;
import java.util.Map;
public class Methods {
    public static void main(String[] args) {
    //演示 : Map集合的常用方法
        Map map = new HashMap();
        //2.V get(Object key) : 根据指定键返回其对应的值,没有则返回null
            map.put("916", "数据结构和计算机网络");
            map.put("935", "数据结构,操作系统和计组");
            map.put("872", "数据结构和操作系统");
        
            String value1 = (String) map.get("916");
            String value2 = (String) map.get("935");
            String value3 = (String) map.get("872");
            String value4 = (String) map.get("408");
            System.out.println("916——" + value1);
            System.out.println("935——" + value2);
            System.out.println("872——" + value3);
            System.out.println("408——" + value4);
    }
}

image.gif

                运行结果 : 

image.png

        3. V remove(Object key) :

                根据指定的键删除集合中对应键值对,返回删除掉的值,若没有则返回null。

                Δ代码演示 : 

                up仍以Methods类为演示类,代码如下 : 

package csdn.knowledge.api_tools.gather.map;
import java.util.HashMap;
import java.util.Map;
public class Methods {
    public static void main(String[] args) {
    //演示 : Map集合的常用方法
        Map map = new HashMap();
        //3.V remove(Object key) : 根据指定的键删除集合中对应键值对,返回删除掉的值,若没有则返回null。
            map.put("916", "数据结构和计算机网络");
            map.put("935", "数据结构,操作系统和计组");
            map.put("872", "数据结构和操作系统");
            System.out.println("map = " + map);
            Object o = map.remove("935");       //实际可不做接收
            System.out.println("删除的值 = " + o);
            System.out.println("map = " + map);
            Object o1 = map.remove("408");
            System.out.println("删除的值 = " + o1);
    }
}

image.gif

                运行结果 : 

image.png

        4. int size() :

                该方法可以获取当前集合中元素的个数(集合中键值对的数量)。

                Δ代码演示 : 

                up仍以Methods类为演示类,代码如下 : 

package csdn.knowledge.api_tools.gather.map;
import java.util.HashMap;
import java.util.Map;
public class Methods {
    public static void main(String[] args) {
    //演示 : Map集合的常用方法 
        Map map = new HashMap();
        //4.int size() : 获取当前集合中元素的个数(集合中键值对的数量)
            map.put("916", "数据结构和计算机网络");
            map.put("935", "数据结构,操作系统和计组");
            map.put("872", "数据结构和操作系统");
            map.put("408", "数据结构,计算机组成原理,操作系统,计算机网络");
            int number = map.size();
            System.out.println("当前集合中元素的个数 = " + number);
    }
}

image.gif

                运行结果 : 

image.png

        5. default V replace(K key, V value) : 

                该方法可以根据指定键,替换掉其在集合中对应的值,并返回被替换的值。

                Δ代码演示 : 

                up仍以Methods类为演示类,代码如下 : 

package csdn.knowledge.api_tools.gather.map;
import java.util.HashMap;
import java.util.Map;
public class Methods {
    public static void main(String[] args) {
    //演示 : Map集合的常用方法
        Map map = new HashMap();
        //5.default V replace(K key, V value) : 根据指定键,替换掉其在集合中对应的值,并返回被替换的值
            map.put("916", "数据结构和计算机网络");
            map.put("935", "数据结构,操作系统和计组");
            map.put("872", "数据结构和操作系统");
            map.put("408", "数据结构,计算机组成原理,操作系统,计算机网络");
            String s = (String) map.replace("916", "900 + 16");
            System.out.println("被替换掉的值 = " + s);
            for (Object o : map.entrySet()) {
                System.out.println(o);
            }
    }
}

image.gif

                运行结果 :image.png

        6. boolean isEmpty() : 

                该方法可以判断当前集合是否为空。

                Δ代码演示 : 

                up仍以Methods类为演示类,代码如下 : 

package csdn.knowledge.api_tools.gather.map;
import java.util.HashMap;
import java.util.Map;
public class Methods {
    public static void main(String[] args) {
    //演示 : Map集合的常用方法
        Map map = new HashMap();
        //6.boolean isEmpty() : 判断当前集合是否为空。
            System.out.println("当前集合为空吗?" + map.isEmpty());
            map.put(1, "666");
            map.put(2, "233");
            System.out.println("当前集合为空吗?" + map.isEmpty());
    }
}

image.gif

                运行结果 : 

image.png

        7. void clear() : 

                该方法可以清空当前集合中所有的键值对。

                Δ代码演示 : 

                up仍以Methods类为演示类,代码如下 : 

package csdn.knowledge.api_tools.gather.map;
import java.util.HashMap;
import java.util.Map;
public class Methods {
    public static void main(String[] args) {
    //演示 : Map集合的常用方法
        Map map = new HashMap();
        //7.void clear() : 清空当前集合。
            map.put(1, "666");
            map.put(2, "233");
            map.put(3, "141");
            map.put(4, "424");
            System.out.println("map = " + map);
            map.clear();
            System.out.println("map = " + map);
    }
}

image.gif

                运行结果 : 

image.png

        8. boolean containsKey(Object key) : 

                该方法可以查询集合中是否存在指定的键,存在则返回true。

                Δ代码演示 : 

                up仍以Methods类为演示类,代码如下 : 

package csdn.knowledge.api_tools.gather.map;
import java.util.HashMap;
import java.util.Map;
public class Methods {
    public static void main(String[] args) {
    //演示 : Map集合的常用方法
        Map map = new HashMap();
        //8.boolean containsKey(Object key) : 判断集合中是否存在指定键
            map.put(1.1, "迫近的客星");
            map.put(1.2, "白垩与黑龙");
            map.put(1.3, "明霄升海平");
            System.out.println("集合中是否存在1.1键:" + map.containsKey(1.1));
            System.out.println("集合中是否存在1.3键:" + map.containsKey(1.1));
            System.out.println("集合中是否存在2.1键:" + map.containsKey(2.1));
    }
}

image.gif

                运行结果 : 

image.png

        9. Set<K> keySet() : 

                该方法可以获取到当前Map集合中所有的键,并将它们存在在一个Set集合中,返回该Set集合。

                Δ代码演示 : 

                up仍以Methods类为演示类,代码如下 : 

package csdn.knowledge.api_tools.gather.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Methods {
    public static void main(String[] args) {
    //演示 : Map集合的常用方法
        Map map = new HashMap();
        //9.Set<K> keySet() : 获取键的集合,返回一个Set集合。
            map.put("胡图图", "动耳神功");
            map.put("胡英俊", "英俊潇洒");
            map.put("胡歌", "好男人胡歌");
            Set set = map.keySet();
            System.out.println(set);
    }
}

image.gif

                运行结果 : 

image.png


五、 Map集合的遍历

        0.前言 : 

                java的设计者提供了一些机制来更好地遍历Map集合——它们令HashMap类的Node类型实现了Map类的Entry接口,而Entry接口中提供了访问键和值的方法

image.png

                同时,它们又在HashMap类中定义了EntrySet类型用于替代Map集合进行遍历操作,相当于EntrySet指向了Map集合中的元素,遍历EntrySet类型中的键值对实际上仍是遍历Map集合中实际存在的键值对

image.png

                可以通过entrySet方法来获取指向了Map集合中键值对的Set集合,如下 : 

image.png

                可以看到,其元素类型为Map.Entry类型。 

                上面这一大堆,说句人话就是——java的爸爸们把Node类型做成了Entry类型,又想办法放到EntrySet里面去了,最终是为了方便Map集合的遍历

image.png

        1.方式一 —— 通过keySet方法和get方法

                ①步骤 : 

                1.获取所有键的集合
               2.遍历所有的键,获取到每一个键
               3.根据键,获取指定的值

                ②代码演示 : 

                up以Traverse_map类为演示类,代码如下

package csdn.knowledge.api_tools.gather.map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class Traverse_map {
    public static void main(String[] args) {
    //演示 : 遍历Map集合方式一
        Map map = new HashMap();
        map.put(1, "张三");
        map.put(2, "李四");
        map.put(3, "王五");
        map.put(4, "赵六");
        //1.获取所有键的集合
        Set keys = map.keySet();
        Iterator iterator = keys.iterator();
        //2.遍历所有的键,获取到每一个键
        System.out.println("================迭代器遍历:====================");
        while (iterator.hasNext()) {
            Integer integer = (Integer) iterator.next();
            //3.根据键,获取指定的值
            String value = (String) map.get(integer);
            System.out.println("key = " + integer + ", value = " + value);
        }
        System.out.println("================增强for遍历:====================");
        for (Object key : keys) {
            Integer integer = (Integer) key;
            String value = (String) map.get(integer);
            System.out.println("key = " + integer + ", value = " + value);
        }
    }
}

image.gif

                运行结果 : 

image.png

        2.方式二 —— 通过values方法

                ①步骤 : 

                1.根据values方法获取所有的值
               2.利用迭代器或者增强for遍历获取到的值

                ②代码演示 :  

                up仍以Traverse_map类为演示类,代码如下

package csdn.knowledge.api_tools.gather.map;
import java.util.*;
/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class Traverse_map {
    public static void main(String[] args) {
    //演示 : 遍历Map集合方式二
        Map map = new HashMap();
        map.put("比企谷八幡", "雪之下雪乃");
        map.put("神田空太", "稚名真白");
        map.put("三鹰仁", "上井草美咲");
        //1.获取所有的值
        Collection values = map.values();
        Iterator iterator = values.iterator();
        //2.遍历获取到的值
        System.out.println("================迭代器遍历:=================");
        while (iterator.hasNext()) {
            String value = (String) iterator.next();
            System.out.println(value);
        }
        System.out.println("================增强for遍历:================");
        for (Object value : values) {
            System.out.println(value);
        }
    }
}

image.gif

                运行结果 : 

image.png

        3.方式三 —— 通过entrySet方法

                ①步骤 : 

                1.根据entrySet方法获取到——保存了Map.Entry类型元素的——Set集合
               2.利用迭代器或者增强for遍历获取到的Set集合
                3.注意,Set集合中的元素,编译类型是Entry类型,但运行类型其实是Node类型

                ②代码演示 :  

                up仍以Traverse_map类为演示类,代码如下

package csdn.knowledge.api_tools.gather.map;
import java.util.*;
/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class Traverse_map {
    public static void main(String[] args) {
    //演示 : 遍历Map集合方式三
        Map map = new HashMap();
        map.put("比企谷八幡", "雪之下雪乃");
        map.put("神田空太", "稚名真白");
        map.put("三鹰仁", "上井草美咲");
        //1.根据entrySet方法获取到保存键值对的Set集合
        Set mappings = map.entrySet();
        Iterator iterator = mappings.iterator();
        //2.遍历获取到的Set集合
        System.out.println("================迭代器遍历:=================");
        while (iterator.hasNext()) {
            Object entry = iterator.next();
            System.out.println(entry);
        }
        System.out.println("================增强for遍历:================");
        for (Object mapping : mappings) {
            Map.Entry entry = (Map.Entry) mapping;  //多态(Entry类型指向了Node类型)
            System.out.println(entry);
        }
    }
}

image.gif

                运行结果 : 

image.png


六、HashMap源码解读(深度讲解)

                链接如下 : 

image     https://blog.csdn.net/TYRA9/article/details/129781346?spm=1001.2014.3001.5501                

HashMap类主要内容包括 : 

                ①HashMap类简介

                ②HashMap类的底层实现

                ③HashMap类的源码分析


七、Hashtable及其子类Properties源码解读

                链接如下 : 

image   https://blog.csdn.net/TYRA9/article/details/129821222?spm=1001.2014.3001.5501                  

Hashtable及其子类Properties主要内容包括 : 

                ①Hashtable类详解(1° 简介;2° 特点;3° 底层实现;4° 比较)

                ②Properties类详解(1° 简介;2° 特点;3° 具体使用)


八、TreeMap源码解读

                链接如下 : 

imagehttps://blog.csdn.net/TYRA9/article/details/129906619?spm=1001.2014.3001.5501               

TreeMap主要内容如下 : 

                ①TreeSet类简介

                ②TreeSet类的底层实现

                ③TreeMap类简介

                ④TreeMap类的底层实现


九、完结撒❀

                🆗,以上就是我们Map集合的全部内容了。重点仍是Map接口的几个常用实现类的源码分析。下一小节内容up计划与大家分享关于Collections类的内容,Collections类讲解完后,整个API常用工具——集合就算是讲解完毕了。感觉阅读!

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。