目录

一、前言

二、概述

三、特点

四、常用方法

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包下,如下图所示 : 

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

可以看到,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);}
}

运行结果 : 

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) : 根据指定键返回其对应的值,没有则返回nullmap.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);}
}

运行结果 : 

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);}
}

运行结果 : 

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);}
}

运行结果 : 

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);}}
}

运行结果 : 

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());}
}

运行结果 : 

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);}
}

运行结果 : 

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));}
}

运行结果 : 

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);}
}

运行结果 : 


五、 Map集合的遍历

0.前言 :

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

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

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

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

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);}}
}

运行结果 : 

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);}}
}

运行结果 : 

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);}}
}

运行结果 : 


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

链接如下 : 

https://blog.csdn.net/TYRA9/article/details/129781346?spm=1001.2014.3001.5501https://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.5501https://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.5501https://blog.csdn.net/TYRA9/article/details/129906619?spm=1001.2014.3001.5501                TreeMap主要内容如下 : 

                ①TreeSet类简介

                ②TreeSet类的底层实现

                ③TreeMap类简介

                ④TreeMap类的底层实现


九、完结撒❀

java 双列集合Map 万字详解相关推荐

  1. 【Java】如何理解Java中的双列集合Map?

    1 Map<K,V>接口 1.1 特点 双列集合一个元素包含俩值 Key不可以重复,Value可以重复 Key和Value一一对应 Key和Value可以时任意类型 1.2 常用方法 pu ...

  2. JAVA day20、21 双列集合Map<K,V>:HashMap,LinkedHashMap,TreeMap,Hashtable, ConcurrentHashMap;JDK1.9新特性

    一.Map<K,V> Java提供了专⻔的集合类⽤来存放这种这种⼀⼀对应的关系,叫做映射对象,即 java.util.Map 接⼝. 类型参数: K - 此映射所维护的键的类型 V - 映 ...

  3. Java双列集合之Map以及斗地主案列

    Map集合 知识点-- 概述 讲解 图文演示 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的 ...

  4. 双列集合Map的实现类

    Map接口[和Collection接口并列] Map接口 成员方法[实现于Map接口,TreeMap也可实现,这里以HashMap为例] //HashMap实现类 :无序[HashSet底存原理] 哈 ...

  5. 终于有人把 java代理 讲清楚了,万字详解!

    什么是代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联 ...

  6. java Date 和 Calendar类 万字详解(通俗易懂)

    Date类介绍 Date类构造器 Date类使用 关于SimpleDateFormat类 Date类对象的格式化 构造Date对象的补充 Date类对象成员方法 Calendar类介绍及使用 字段演示 ...

  7. 终于有人把 Java代理讲清楚了,万字详解!

    什么是代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联 ...

  8. Java数据结构及工具类的详解

    `1 数据结构 常见的数据结构 : 栈堆 , 队列, 数组, 链表和红黑树 栈 栈 : 它是运算受限的线性表, 其限制是仅允许在标的一端进行插入和删除操作, 不允许在其他任何位置进行添加, 查找, 删 ...

  9. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

最新文章

  1. 区别 eks_sport 和 exercise 有什么区别?看完你就清楚了!
  2. BERT轻量化:最优参数子集Bort,大小仅为BERT-large16%
  3. 百度贴吧排名计算方式
  4. alien指令 linux,使用alien命令让deb包和rpm包互相转换
  5. 8-Spring Boot消息服务
  6. [Android]Fragment生命周期
  7. 《CATIA V5 从入门到精通(第二版)》——2.3 操作草图(Operation)
  8. 在 Mac 上右键单击的方法
  9. hadoop 注解之 interfaceAudience interfaceStability
  10. kinetis时钟模块MCG详解
  11. 物联网工业串口转WiFi模块 无线路由WiFi模块的选型
  12. 照片估计明星身高matlab,娱乐圈部分明星真实身高 (净高版)
  13. android连接程序,从Android应用程序连接到本地后端
  14. 【WSN定位】基于matlab灰狼算法优化无线传感器非测距定位【含Matlab源码 2008期】
  15. 抽奖功能java开发_基于Java实现抽奖系统
  16. linux环境下安装node
  17. 万户OA助力红豆集团信息化建设方案
  18. vue elementui table 复选框
  19. 2021年「博客之星」参赛博主:dnbug Blog
  20. Java中常见程序:万年历,进制转换等

热门文章

  1. 专业工作站与高级PC区别及品牌机对比
  2. 最佳机器学习公共数据集
  3. 初识EMC元器件(五)——电容参数解读及选型应用
  4. Mysql Workbench connection ssl not enable问题解决
  5. python --给图片加文字
  6. 【食品化学与营养】第一章 绪论 笔记
  7. 请简要说明西门子PLC1500的主要功能
  8. 计算机上机考试能复制粘贴吗?
  9. Python实现企业微信发送图片
  10. Hive(2)——使用总结