目录
5. default V replace(K key, V value) :
8. boolean containsKey(Object key) :
一、前言
大家好,本篇博文是对集合框架中的双列集合——Map集合的一个深度总结。主要内容包括了Map集合的介绍、特点、常用方法演示、遍历方式,以及Map接口的几个常用实现类——HashMap,Hashtable,TreeMap的源码分析。
注意 :①代码中的注释也很重要;②不要眼高手低,自己跟着过一遍才算有收获;③点击文章的侧边栏目录或者文章开头的目录可以进行跳转。良工不示人以朴,所有文章都会适时补充完善。大家如果有问题都可以在评论区进行交流或者私信up。感谢阅读!
二、概述
1° Map接口与Collection接口并列存在,与Collection系列的单列集合相对,Map是双列集合,用于保存具有映射关系的数据Key-Value(键值对)。
2° Map接口也属于java.base模块,java.util包下,如下图所示 :
3° 再来回顾一下Map集合体系的类图,如下 :
可以看到,Map接口常用的实现类有三个——Hashtable, HashMap, 和TreeMap,并且还有两个常用实现类Properties和LinkedHashMap分别是Hashtable和HashMap的子类。
三、特点
1°Map集合中的元素由key-value键值对(Entry)构成,其中key和value可以由任意引用类型的键值对构成,会封装到HashMap$Node对象中。
2° 键值对中的key不可重复(底层同HashSet),但是value可以重复。所以,当key或者value为null时,key只能有一个是null,而value可以有多个是null。
3° 键值对中的key常用String类型来表示。
4° key和value之间存在一一映射关系,即总可以通过指定的key来找到其对应的value。
5°一个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); } }
运行结果 :
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); } }
运行结果 :
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); } }
运行结果 :
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); } }
运行结果 :
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); } } }
运行结果 :
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()); } }
运行结果 :
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); } }
运行结果 :
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)); } }
运行结果 :
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); } }
运行结果 :
五、 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类为演示类,代码如下 :
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); } } }
运行结果 :
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); } } }
运行结果 :
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); } } }
运行结果 :
六、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----------------------------------------------------------------------------");