java 双列集合Map 万字详解

简介: 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类为演示类,代码如下 :

packagecsdn.knowledge.api_tools.gather.map;
importjava.util.HashMap;
importjava.util.Map;
publicclassMethods {
publicstaticvoidmain(String[] args) {
//演示 : Map集合的常用方法Mapmap=newHashMap();
//1.V put(K key, V value) : 以键值对的形式向集合中添加元素/*首次添加某元素时,返回null;重复添加相同键的元素时,新值覆盖旧值,并返回旧值*/Objecto=map.put("916", "计算机网络和数据结构");
System.out.println(o);
Objecto2=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类为演示类,代码如下 :

packagecsdn.knowledge.api_tools.gather.map;
importjava.util.HashMap;
importjava.util.Map;
publicclassMethods {
publicstaticvoidmain(String[] args) {
//演示 : Map集合的常用方法Mapmap=newHashMap();
//2.V get(Object key) : 根据指定键返回其对应的值,没有则返回nullmap.put("916", "数据结构和计算机网络");
map.put("935", "数据结构,操作系统和计组");
map.put("872", "数据结构和操作系统");
Stringvalue1= (String) map.get("916");
Stringvalue2= (String) map.get("935");
Stringvalue3= (String) map.get("872");
Stringvalue4= (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类为演示类,代码如下 :

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

image.gif

               运行结果 :

image.png

       4. int size() :

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

              Δ代码演示 :

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

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

image.gif

               运行结果 :

image.png

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

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

              Δ代码演示 :

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

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

image.gif

               运行结果 :image.png

       6. boolean isEmpty() :

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

              Δ代码演示 :

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

packagecsdn.knowledge.api_tools.gather.map;
importjava.util.HashMap;
importjava.util.Map;
publicclassMethods {
publicstaticvoidmain(String[] args) {
//演示 : Map集合的常用方法Mapmap=newHashMap();
//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类为演示类,代码如下 :

packagecsdn.knowledge.api_tools.gather.map;
importjava.util.HashMap;
importjava.util.Map;
publicclassMethods {
publicstaticvoidmain(String[] args) {
//演示 : Map集合的常用方法Mapmap=newHashMap();
//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类为演示类,代码如下 :

packagecsdn.knowledge.api_tools.gather.map;
importjava.util.HashMap;
importjava.util.Map;
publicclassMethods {
publicstaticvoidmain(String[] args) {
//演示 : Map集合的常用方法Mapmap=newHashMap();
//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类为演示类,代码如下 :

packagecsdn.knowledge.api_tools.gather.map;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Set;
publicclassMethods {
publicstaticvoidmain(String[] args) {
//演示 : Map集合的常用方法Mapmap=newHashMap();
//9.Set<K> keySet() : 获取键的集合,返回一个Set集合。map.put("胡图图", "动耳神功");
map.put("胡英俊", "英俊潇洒");
map.put("胡歌", "好男人胡歌");
Setset=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类为演示类,代码如下 :

packagecsdn.knowledge.api_tools.gather.map;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.Set;
/*** @author : Cyan_RA9* @version : 21.0*/publicclassTraverse_map {
publicstaticvoidmain(String[] args) {
//演示 : 遍历Map集合方式一Mapmap=newHashMap();
map.put(1, "张三");
map.put(2, "李四");
map.put(3, "王五");
map.put(4, "赵六");
//1.获取所有键的集合Setkeys=map.keySet();
Iteratoriterator=keys.iterator();
//2.遍历所有的键,获取到每一个键System.out.println("================迭代器遍历:====================");
while (iterator.hasNext()) {
Integerinteger= (Integer) iterator.next();
//3.根据键,获取指定的值Stringvalue= (String) map.get(integer);
System.out.println("key = "+integer+", value = "+value);
        }
System.out.println("================增强for遍历:====================");
for (Objectkey : keys) {
Integerinteger= (Integer) key;
Stringvalue= (String) map.get(integer);
System.out.println("key = "+integer+", value = "+value);
        }
    }
}

image.gif

              运行结果 :

image.png

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

              ①步骤 :

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

              ②代码演示 :  

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

packagecsdn.knowledge.api_tools.gather.map;
importjava.util.*;
/*** @author : Cyan_RA9* @version : 21.0*/publicclassTraverse_map {
publicstaticvoidmain(String[] args) {
//演示 : 遍历Map集合方式二Mapmap=newHashMap();
map.put("比企谷八幡", "雪之下雪乃");
map.put("神田空太", "稚名真白");
map.put("三鹰仁", "上井草美咲");
//1.获取所有的值Collectionvalues=map.values();
Iteratoriterator=values.iterator();
//2.遍历获取到的值System.out.println("================迭代器遍历:=================");
while (iterator.hasNext()) {
Stringvalue= (String) iterator.next();
System.out.println(value);
        }
System.out.println("================增强for遍历:================");
for (Objectvalue : 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类为演示类,代码如下 :

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

image.gif

              运行结果 :

image.png


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

               链接如下 :

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

   HashMap类主要内容包括 :

               ①HashMap类简介

               ②HashMap类的底层实现

               ③HashMap类的源码分析


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

               链接如下 :

  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源码解读

               链接如下 :

https://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----------------------------------------------------------------------------");

目录
相关文章
|
14天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
34 3
|
3月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
91 2
|
1月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
45 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
50 4
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
42 2
|
2月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
2月前
|
Java 开发者
从 Java 中的 Set 集合中删除元素
【10月更文挑战第30天】
|
2月前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
51 1