新学期预习吗?数据结构集合框架Map的方法和实例讲解

一、Map接口

Map特性:
Map接口最显著的特征就是有了键和值,映射的关系,可以通过键来获取值。

1.1、概念和应用场景

Map是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有:

  1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢
  2. 二分查找,时间复杂度为O(log 2 n) ,但搜索前必须要求序列是有序的。

上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:

  1. 根据姓名查询考试成绩
  2. 通讯录,即根据姓名查询联系方式
  3. 不重复集合,即需要先搜索关键字是否已经在集合中
    可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的Map这种适合动态查找的集合容器。

1.2、Map的两种模型

一般把搜索的数据称为关键字key,关键字对应的值称为Value,一对key-value将其称为键值对。这样的模型有两种:

1:纯key模型,比如:
有一个英文词典,快速查找一个单词是否在词典中 。 快速查找某个名字在不在通讯录中

2. Key-Value 模型,比如:
统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>
梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号
而Map中存储的就是key-value的键值对。

1.3、 Map接口和其他集合框架的继承关系

在这里插入图片描述
通过上面的图我们发现,Map接口是相对于list,set,queue来说相对独立的一个接口,它有3个子类,HashMap,TreeMap,SortMap。

1.4、Map接口的说明

Map是一个接口类,该类没有继承自Collection,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。
敲黑板!!!,Map的K一定是唯一的。就像函数的对应法则一样,可以一对多,但是不能多对一。利用这个特性,以后在遇到统计次数的问题时,Map就能很好的帮上忙。

二、Map常用的方法

2.1、put(K key,V value) 将指定的KV对放进map

//先创建一个map实例
Map<Integer,String> map=new HashMap<>();
   map.put(601,"生日");
   map.put(2001,"出生年份");
   System.out.println(map);

Key和value具体的类型根据上面创建实例时的类型相同。

2.2、getOrDefault(Object K,V defaultValue)

返回 key 对应的 value,key 不存在,返回默认值,默认值由自己定义。

 // 找得到的情况
System.out.println("找得到的情况 + 对应的Value值"+map.getOrDefault(2001,"找得到"));
 //找不到的情况
System.out.println("找不到的情况 + 对应的Value值"+map.getOrDefault(258,"没找到用111代替"));

效果如下:
在这里插入图片描述
在第一条中我们put了生日,和出生年份两对数据,我们在这里再用getOrDefault方法来测试。

2.3、boolean containsValue(Object K)

判断是否存在value,返回值为布尔类型。

  //找得到的情况
System.out.println("找得到生日吗   "+map.containsValue("生日"));
//找不得的情况
System.out.println("找得到出生年份吗    "+map.containsValue("出生年份"));

效果如下:
在这里插入图片描述

2.4、boolean containsKey(Object K)


 //找得到的情况
 System.out.println("找得到601吗  "+map.containsKey(601));
//找不到的情况
 System.out.println("找得到602吗  "+map.containsKey(602));

效果和上面的是类似的,只不过上面的value换成了key。

2.5、set<Map.Entry<K,V>> entrySet()

返回所有的 key-value 映射关系,就是将一对Key,和它对应的Vaule当作一个整体返回,而这个set包含了当前map的所有关系对。一般用来遍历map。

 /*4:set<Map.Entry<K,V>> entrySet()
        将所有键值对返回
        就是把一整个key,value当成一个值返回。            
        for each用法 :左边是变量类型和变量名(变量名可以随意) 右边是要遍历的对象
         */
        System.out.println("Map.enteySet");
        for (Map.Entry<Integer,String> entry :map.entrySet()) {
            System.out.print(entry.getKey()+"     ");
            System.out.print(entry.getValue()+"     ");
        }
        System.out.println();

效果如下:
在这里插入图片描述
这里我用了for each的方法并且在循环里使用了entry.getkey和entry.getvalue方法,这样就使map中的每一个key,每一个value都单独打印出来。

2.6关于Map.Entry<K, V>的说明

Map.Entry<K, V> 是Map内部实现的用来存放<key, value>键值对映射关系的内部类,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式。

它具体以下方法:
在这里插入图片描述

2.7、boolean isEmpty()

判断当前map是否为空

 System.out.println("现在是不为空的 返回"+map.isEmpty());

当前map是不为空的所以返回false。

2.8、int size()

返回键值对的数量就是有多少组数据

  System.out.println("当前map的键值对数量   "+map.size());

三、方法实例

光说不练假把式, 我们来创建一个实例练习练习。这里用的是TreeMap实例化Map。大家可以试试用HashMap练习。

Map<String, String> m = new TreeMap<>();
// put(key, value):插入key-value的键值对
// 如果key不存在,会将key-value的键值对插入到map中,返回null
m.put("林冲", "豹子头");
m.put("鲁智深", "花和尚");
m.put("武松", "行者");
m.put("宋江", "及时雨");
String str = m.put("李逵", "黑旋风");
System.out.println(m.size());
System.out.println(m);
// put(key,value): 注意key不能为空,但是value可以为空
// key如果为空,会抛出空指针异常
//m.put(null, "花名");
str = m.put("无名", null);
System.out.println(m.size());
// put(key, value):
// 如果key存在,会使用value替换原来key所对应的value,返回旧value
str = m.put("李逵", "铁牛");
// get(key): 返回key所对应的value
// 如果key存在,返回key所对应的value
// 如果key不存在,返回null
System.out.println(m.get("鲁智深"));
System.out.println(m.get("史进"));
//GetOrDefault(): 如果key存在,返回与key所对应的value,如果key不存在,返回一个默认值
System.out.println(m.getOrDefault("李逵", "铁牛"));
System.out.println(m.getOrDefault("史进", "九纹龙"));
System.out.println(m.size());
//containKey(key):检测key是否包含在Map中,时间复杂度:O(logN)
// 按照红黑树的性质来进行查找
// 找到返回true,否则返回false
System.out.println(m.containsKey("林冲"));
System.out.println(m.containsKey("史进"));
// containValue(value): 检测value是否包含在Map中,时间复杂度: O(N)
// 因为TreeMap是按照Key进行组织的,因此查找value时候就需要整体遍历
// 找到返回true,否则返回false
System.out.println(m.containsValue("豹子头"));
System.out.println(m.containsValue("九纹龙"));

运行效果如下:
在这里插入图片描述

四、结尾

最后祝大家开学学习顺利,我的文章能帮助你起到提前预习的作用,再也不怕上课听不懂了。

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

见闻色霸气~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值