文章目录
一、Map接口
Map特性:
Map接口最显著的特征就是有了键和值,映射的关系,可以通过键来获取值。
1.1、概念和应用场景
Map是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有:
- 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢
- 二分查找,时间复杂度为O(log 2 n) ,但搜索前必须要求序列是有序的。
上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:
- 根据姓名查询考试成绩
- 通讯录,即根据姓名查询联系方式
- 不重复集合,即需要先搜索关键字是否已经在集合中
可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的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("九纹龙"));
运行效果如下:
四、结尾
最后祝大家开学学习顺利,我的文章能帮助你起到提前预习的作用,再也不怕上课听不懂了。