1、搜索
1.1概念
Map和Set是一种专门用来搜索的容器或者数据结构,其搜索的效率与具体的实例化子类有关。
1.2模型
一般把搜索的数据叫关键字(key),和关键字对应的值成为值(value),这就称为key-value的键值对,所以模型会有两种:
①纯key 模型:有一个字典,查找某个字是否存在,此时单纯的搜索用set
②key-value 键值对模型:统计文件中某个单词出现的次数,统计的结果都应该包含:单词+出现的次数 <单词,出现的次数>,此时就用Map
2、Map的常见操作
a.添加操作(put)
Map<String,String> map = new HashMap<>();
//添加元素
map.put("宋江","及时雨");
map.put("李逵","黑旋风");
map.put("吴用","智多星");
若key不存在则将key-value添加到map中,若已经存在,则会覆盖掉原先的数据,显示新的key-value:
map.put("宋江","及时雨");
map.put("李逵","黑旋风");
map.put("吴用","智多星");
map.put("吴用","军师");
b.根据key 取得value(get)
①get(key):根据key 取得 value,若key不存在,则返回null
②getOrDefault(key):根据key返回value,若key不存在,则返回设置的默认值
System.out.println(map.get("宋江"));//->及时雨
System.out.println(map.get("鲁智深"));//-> null
System.out.println(map.getOrDefault("鲁智深","花和尚"));
c.删除(remove) 返回键值对的value值
System.out.println(map.remove("宋江")); //->及时雨
d.遍历(一般不用),要遍历map集合,就需要把Map转为Set集合(因为Collection接口及其子类中实现了for-each循环遍历,但是Map集合跟Collection集合毫无关系),然后进行遍历操作,用方法Map.Entry来实现,就相当于把Map中的键值对包装起来放进Set集合中
map.put("宋江","及时雨");
map.put("李逵","黑旋风");
map.put("吴用","智多星");
//遍历操作
//需要将Map转为Set<Map.Entry>
//Map->Set
Set<Map.Entry<String,String >> entries = map.entrySet();
//for-each遍历Set集合
for (Map.Entry<String ,String > entry:entries){
System.out.println(entry.getKey()+"="+entry.getValue());
}
e.Map集合的搜索※
contains方法再Map中是非常高效的,HasMap中接近O(1),TreeMap中接近O(logn)
System.out.println(map.containsKey("宋江"));
System.out.println(map.containsValue("及时雨"));
3、Set的使用
Set集合的使用,等同于List,都是Collection的子接口,最常使用Set集合的场景,用在元素去重!!
例题:136. 只出现一次的数字 - 力扣(LeetCode) (leetcode-cn.com)
138. 复制带随机指针的链表 - 力扣(LeetCode) (leetcode-cn.com)