常用的Java集合有三种Set、Map和List,那么它们之间有什么关系呢?
一、Set和Map
Set是一种集合元素无序且不可重复的集合,Map代表一种由多个键值对组成的集合,其中键值不可重复,Map集合其实类似于传统的关联数组。表面上看这两个集合之间相似性很少,实际上他们之间有莫大的关联,可以说Map集合是Set集合的扩展。
1、Set和Map的关系
表面上看这两个集合并没有关联之处,但如果只考察Map集合的key,不难发现,这些Map的key具有一个特征:不能重复且无序。也就是说,如果将Map集合的所有key集中起来,这些key就组成了一个Set集合。如果查API文档会发现Map集合提供了Set<K> keySet()这个方法返回所有key组成的Set集合。
由此可见,Map的所有key具有Set集合元素的特征,其实,还可以实现从Set到Map的扩展--对于Map而言,相当于每个元素都是key-value的Set集合。对于一个Map集合而言,它本质上是一个关联数组。
2、HashMap和HashSet
HashMap和HashSet有很多相似之处。对于HashSet而言,系统采用Hash算法决定集合元素的存储位置,这样可以保证快速存取集合元素;对于HashMap而言,系统将value当成key的附属,系统根据Hash算法来决定key的存储位置,这样可以保证快速存取集合key而value总是紧随key存取。
在这里需要指出一点:虽然集合号称存储的是Java对象,但实际上不会真正将Java对象放入Set集合中,而只是在Set集合中保留这些对象的引用而已。也就是说,Java集合实际上是多个引用变量所组成的集合,这些引用变量指向实际的Java对象。