目录
2.2 Map.Entry<K,V>
1、介绍
1.1 Map和Set
Map和Set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。
Map和Set能够在查找时进行一些插入和删除的操作,即动态查找。
1.2 模型
一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以模型会有两种:
- 纯Key模型:数据仅包含关键字。
- Key-Value模型:数据除关键字外,还有关键字所对应的值。例如:统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>。
Map集合是Key-Value模型;而Set集合是纯Key模型。
2、Map集合
2.1 Map集合说明
Map是一个接口类,该接口没有继承自Collection,是一个单独的接口,为Key-Value模型,存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。 (K不可重复,V可重复)
2.2 Map.Entry<K,V>
Entry是Map接口的一个内部接口,是用来存放<Key,Value>键值对映射关系的内部接口。
内部接口Map.Entry<K,V>主要提供了<Key,Value>的获取,Value的设置以及Key的比较方式。
注意:Map.Entry<K,V>并没有提供设置Key的方法 !!!Key无法修改!!!
同样,实现Map接口的类也需要实现Entry接口:
这里以TreeMap的内部类Entry为例,Entry实现了的Map.Entry接口,而Entry就相当于我们之前所学二叉树的一个节点TreeNode。
TreeMap的底层是一个红黑树(下文详解),TreeMap的内部类Entry就相当于红黑树的一个节点,有key、value等属性。
2.3 Map常用方法
演示如下:
若我们使用get方法来获取一个不存在的key的value值时,返回的value为null,
所以当value为Integer类型时,最好使用包装类Integer接收,若使用int基本类型接收会自动拆箱,可能抛出空指针异常:
需要注意的是keySet、values、entrySet方法:
- keySet,可以将key值放在Set集合中,返回Set集合;
- values,可以将value值放在Collection集合中,返回Collection集合;
- entrySet,可以将key-value映射关系放在Set集合中,返回Set集合。
注意:Map系列集合是不能用迭代器实现遍历的,若想使用迭代器遍历,需要使用keySet、values、entrySet方法转换为Set集合,再使用迭代器遍历!!!
2.4 Map注意事项及实现类
- Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap
- Map中存放键值对的Key不能重复,value是可以重复的
- 在TreeMap中插入键值对时,key不能为空,否则就会抛NullPointerException异常,value可以为空。(TreeMap底层是一颗红黑树,涉及key之间的比较)
- HashMap的key和value都可以为空。
- Map中的Key可以全部分离出来,存储到Set中来进行访问(Key不能重复)。
- Map中的value可以全部分离出来,存储在Collection的集合中,若要存储在Collection的子集合中则需强转(value可以有重复)。
- Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。
- TreeMap和HashMap是实现Map的集合类
TreeMap与HashMap:
下文细讲TreeMap与HashMap。
3、Set集合
3.1 Set集合说明
Set集合是纯Key模型,也就是说,Set只存储了Key。
Set集合中的Key值也不能重复存在,能够达到天然去重的效果。