上篇博客介绍了collection接口下的几种集合,这篇博客我们来看一下map下的几种集合。
map简介
Map用于保存具有映射关系的数据,即键值对类型,其中key和value都可以是任何引用类型的数据,当然key不能重复。值得注意的是,Map包含了一个keySet()方法,用于返回Map里所有key组成的Set集合。我们要从代码复用的角度去理解,java是先实现了Map,然后通过包装了一个所有value都为null的Map就实现了Set集合
HashMap
和HashSet集合不能保证元素的顺序一样,HashMap也不能保证key-value对的顺序。并且类似于HashSet判断两个key是否相等的标准也是: 两个key通过equals()方法比较返回true。
1. 无序
2. 线程不安全,所以性能比hashtable高一点
3. 可以使用null作为key或者value(最多允许一个key为null)
LinkedHashMap
HashMap的子类,LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致(注意和TreeMap对所有的key-value进行排序进行区。
1. 有序(链表)
2. 迭代时性能较好
Hashtable
一个古老的Map实现类
1. 无序
2. 线程安全,所以性能比HashMap低一点
3. 不允许有null值
Properties
Hashtable的子类,Properties对象在处理属性文件时特别方便(windows平台上的.ini文件),Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入到属性文件中,也可以把属性文件中的”属性名-属性值”加载到Map对象中
SortedMap
正如Set接口派生出SortedSet子接口,SortedSet接口有一个TreeSet实现类一样,Map接口也派生出一个SortedMap子接口,SortedMap接口也有一个TreeMap实现类。
####TreeMap
TreeMap就是一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。TreeMap存储key-value对(节点)时,需要根据key对节点进行排序。TreeMap可以保证所有的key-value对处于有序状态。同样,TreeMap也有两种排序方式:
自然排序、定制排序
###WeakHashMap
WeakHashMap与HashMap的用法基本相似。区别在于:
HashMap的key保留了对实际对象的”强引用”,这意味着只要该HashMap对象不被销毁,该HashMap所引用的对象就不会被垃圾回收。但WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,当垃圾回收了该key所对应的实际对象之后,WeakHashMap也可能自动删除这些key所对应的
key-value对
IdentityHashMap
IdentityHashMap的实现机制与HashMap基本相似,在IdentityHashMap中,当且仅当两个key严格相等(key1 == key2)时,IdentityHashMap才认为两个key相等
EnumMap
EnumMap是一个与枚举类一起使用的Map实现,EnumMap中的所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式或隐式指定它对应的枚举类。EnumMap根据key的自然顺序,即枚举值在枚举类中的定义顺序来排序。
总结
- TreeMap通常比HashMap,Hashtable慢,但是有序。
- HashSet和HashMap,Hashtable及其子类等都采用hash算法来决定Map中key的存储。