1.Map集合
Map集合是双列集合,一个元素包含两个数据,分别是键和值
键和值是一 一对应的关系,一个键只能有一个值,并且键不能重复,值可以重复
键和值合在一起称为键值对对象
应用场景
如下图,我们在购物的时候会在一个商家那购买多件商品,就需要用单列集合进行存储,但是我们买的商品可能会来源于不同的商家,所以我们要使用双列集合,键对应不同的商家,值就对应用单列集合存储的商品
2.Map集合常用的方法
[1]put:添加元素
双列集合一次存两个数据,所以泛型也需要指定两种。Map集合是接口,需要用多态形式创建
注意事项:如果键已经存在,就会用新值替换旧值
之前说过键是不能重复的,如果在使用put方法,添加的元素中存在键重复,那么新添加的元素的值就会替换掉旧值
put方法返回的类型是值的泛型,返回值是被覆盖掉的值,没有必要接收
[2]remove:根据键删除键值对
remove的返回值是被删除的键,所对应的值,没有必要接
..
[3]clear、isEmpty、size
[4]containsKey、containsValue:是否包含键、值
..
3.TreeMap、HashMap、LinkedHashMap
它们的原理和单列集合一样 ,使用也和单列集合一样
HashMap的原理
因为双列集合的底层结构和单列集合一样,所以我们这里就挑HashMap进行讲解
[1]创建了HashMap后,产生一个数组
[2]使用put方法添加键值对,之后会将这两个数据封装在Entry的对象中
[3]随后,Entry对象会取出键计算应存入索引位置,计算的方式也和之前说HashSet一样
[4]接着,根据索引存入索引位置,若位置为空则直接存入,有元素就调用equals方法判断
[5]挂了12个元素,或者链表挂载元素超过阈值,进行扩容,重复此操作,直到数组长度到达64,转红黑树
总结
4.Map集合的遍历方式
[1]通过键找值
Map集合有两个方法,分别是根据键获取值、获取到所有的键
我们通过keySet方法获取到所有的键,然后遍历键,再使用get方法获取到所有的值
总结
[2]通过键值对对象获取键和值
Entry即键值对对象,是Map集合的内部类,所以要用Map.Entry的方式调用
通过entrySet获取到所有键值对对象
然后再通过键值对对象调用getKey和getValue获取到键和值
..
总结
[3]使用foreach遍历Map
BigConsumer是一个函数式接口,我们可以使用匿名内部类或者Lambda表达式,重写的accept方法的两个参数分别是键和值
5.案例
1.案例一
1.字符--次数,很明显要使用双列集合,键即是字符,值即是次数
2.遍历字符串,将字符串拆分成一个个的字符
3.使用containsKey方法判断存入的字符是否是第一次存入,是则给值初始化,不是,则获取到值,再对值加1
4.再创建StringBuilder,拼接出答案要求的格式
2.案例二
1.定义双列集合,键对应省,因为有多个市,所以我们使用集合嵌套,值对应单列集合
2.先将市全部装到单列集合
3.再使用put方法将省和单列集合存入双列集合
4.遍历双列集合,获取到键和值,其中键可以直接打印,但是值是集合,还需要继续遍历