【数据结构】MapSet
【概念】
Map和Set是一种专门用于搜索的数据结构,其搜索效率与具体实例化的子类数量有关,本质上是一颗二叉搜索树
搜索的关键数据为关键字“Key”,关键字对应的数据为值“Value”,将其称为“Key-Value键值对”
【关于Map】
Map是一个接口类,该类没有继承至Collection,该类中存储的是<K,V>结构的键值对,且K一定是唯一的,不可重复
【关于Map.Entry<K,V>】
Map.Entry<K,V>是Map内部实现的,用于存放<K,V>键值对之间映射关系的内部类
为什么有Entry?
在Java源码中,Map的接口中又定义了一个内部接口Entry
【关于Map的常用方法】
【实例化Map】
Map<String,String> map = new TreeMap<>();
Map是一个接口,因此它不能去直接实例化,只能去new两个实现类,一个TreeMap,一个HashMap,这里放的TreeMap就是一个二叉搜索树
【设置key对应的value】
Map.put("及时雨", "宋江");
Map.put("齐天大圣", "孙悟空“);
这里设置了两个K和V的键值对,都是一一对应的关系
【获取key对应的value】
String val = map.get("齐天大圣");
System.out.println(val);
该图中value值是一个String,所以需要通过String来进行接收,该图中输出“孙悟空”
但如果get中填写的是“齐天大圣2”这样在Map中对应key没有value的值时,会返回一个null
【返回key对应的value,key若不存在,则返回默认值】
String val2 = map.getOrDefault("齐天大圣2","haha");
System.out.println(val2);
原代码中不存在“齐天大圣2”这个key,因此返回一个自定义默认值“haha”
【删除key对应的value】
String val3 = map.remove("齐天大圣");
System.out.println(val3);
删除了“齐天大圣”这个key,返回其value的同时删除key映射关系
【返回所有key的不重复集合】
Set<String> set = map.keySet<>();
System.out.println(set);
返回[ 及时雨 , 齐天大圣 ]这样的不重复集合结果
因此,Map中的key可以全部分离出来,存储到Set中进行访问(因为key不能重复)
但如果给相同的key设置了不同的value时:
Map.put("及时雨", "宋江");
Map.put("及时雨", "宋江2");
此时在Map中只会保存第二个,即“宋江2”,即:当我们在Map中存储元素时,key如果重复了,就会更新对应的value值,Map具有去重特性
但如果给相同的value设置了不同的key时:
Map.put("及时雨", "宋江");
Map.put("齐天大圣", "宋江");
这是可以的,因此key一定是不一样的,但是value是可重复的
【返回所有key-value的映射关系】
Set<Map.Entry<String,String>> entries = map.entrySet();
“map.entrySet()”这个方法会将key和value组织到一起,
它的返回值是“Set<Map.Entry<K,V>>”,K和V填写key和value的数据类型
现在Set中放入的是"Map.Entry<String,String>"这个数据类型,因此里面存入的就是两个该数据类型的元素
输出方式1:
System.out.println(entries);
通过该代码可以返回:[ 及时雨 = 宋江 , 齐天大圣 = 孙悟空 ]这样的不重复集合结果
输出方式2:
通过该代码可以返回以下结果:
因此,Map中的key可以全部分离出来,存储到Collection中任何一个子集合中(value可能有重复)
【关于Map的总结】
1.Map是一个接口,因此它不能去直接实例化,只能去new两个实现类,一个TreeMap,一个HashMap
2.当我们在Map中存储元素时,key如果重复了,就会更新对应的value值,Map具有去重特性,key一定是不一样的,但是value是可重复的
3.在TreeMap中插入键值对时,key不能为null,否则会抛出空指针异常,value可以为null
此外:HashMap中的key和value都可以为null
4.Map中的key可以全部分离出来,存储到Set中进行访问(因为key不能重复);Map中的key可以全部分离出来,存储到Collection中任何一个子集合中(value可能有重复)
5.Map中键值对的key不能直接修改,value可以修改,若要修改key,只能先将key删除掉,然后才能进行重新插入
6.往TreeMap中存储元素时,key一定要是可以比较的,否则就会报“类型转换”异常
TreeMap是一个二叉搜索树,因此源码内部内置了比较方法
Student在这里是一个自定义类型,且没有告诉代码如何比较,所以会抛出类型转换异常
7.TreeMap和HashMap的区别
【关于Set】
Set和Map的不同点是:Set是继承自Collection的接口类,且Set中只存储了Key
【关于Set的常用方法】
【实例化Set】
【添加元素】
该代码执行后输出的是一个“abc”,而不是两个“abc”
这意味着,Set中不能存储重复的元素
【返回迭代器】
这里的<E>要替换为所打印元素的类型
通过迭代器,可以去遍历Set中所有的元素
【关于Set的总结】
1.Set是继承自Collection的一个接口类
2.Set中只存储了key,并且要求key一定要唯一
3.TreeSet的底层使用Map来实现,其使用Map与Object的一个默认对象作为键值插入到Map中
4.Set最大的功能就是对集合中的元素进行去重
5.Set中的key不能修改,若想修改key只能删除原来的key然后重插
6.TreeSet和HashSet的区别