set集合代表集合元素无序,集合元素不可以重复,map则代表一种由多个key-value对组成的集合,map类似于传统的关联数组,表面上他们之间的关联性很少,但是实际上map和set之间有莫大的关联,可以说map集合是set集合的扩展。
从map集合的继承体系和set集合的继承体系对比来看,这些map接口、实现类和set集合接口、实现类的类名完全相似,把map的后缀改成set后缀即可,set集合和map集合的对应关系如下:
1.Set —Map
2.EnumSet—EnumMap
3.SoretedSet—SortedMap
4.TreeSet—–TreeMap
5.NavigableSet—-NavigableMap
6.HashSet—HashMap
7.LinkedHashSet——-LinkedHashMap
仔细观察图3.2中Map集合的继承体系里被灰色覆盖的区域,可以发现,这些Map集合的接口、实现类的类名和Set集合的接口、实现类的类名完全相似,把Map后缀改为Set后缀即可。Set集合和Map集合的对应关系如下:
Set←→Map
EnumSet←→EnumMap
SortedSet←→SortedMap
TreeSet←→TreeMap
NavigableSet←→NavigableMap
HashSet←→HashMap
LinkedHashSet←→LinkeHashMap
这些接口和类名如此相似绝不是偶然的现象,肯定有其必然的原因。
从表面上看,这两种集合并没有太多的相似之处,但如果只考察Map集合的key,不难发现,这些Map集合的key具有一个特征:所有的key不能重复,key之间没有顺序。也就是说,如果将Map集合的所有key集中起来,那么这些key就组成了一个Set集合。实际上,Map集合提供了如下方法来返回所有key组成的Set集合。
Set keySet()
由此可见,Map集合的所有key将具有Set集合的特征,只要把Map的所有key集中起来看,那它就是一个Set,这实现了从Map到Set的转换。其实,还可以实现从Set到Map的扩展——对于Map而言,相当于每个元素都是key-value对的Set集合。
换一种思维来理解Map集合,如果把Map集合中的value当成key的“附属物”(实际上也是,对于一个Map集合而言,只要给出指定的key,Map总是可以根据该key快速查询到对应的value),那么Map集合在保存key-value对时只要考虑key即可。
对于一个Map集合而言,它本质上是一个关联数组,如图3.3所示。
对于图3.3所示的关联数组,其实可以改为使用一个Set集合来保存它们,反正上面关联数组中的key-value对之间有严格的对应关系,那么干脆将key-value对捆绑在一起对待,如图3.4所示。
为了把Set扩展成Map,可以考虑新定义一个SimpleEntry类,该类代表一个key-value对;当Set集合的集合元素都是SimpleEntry对象时,该Set集合就能被当成Map使用。下面程序示范了如何将一个Set集合扩展成Map集合。
程序清单:codes\03\3.1\Set2Map.java
class SimpleEntry