基于Map
Map是基于K-V结构的容器,key不可重复
1.1 HashMap(线程不安全|无序无重复支持Null值,继承于AbstractMap)
key的维护方式与HashSet相同,通过equals+Hashcode判断键是否重复,利用Hashcode决定顺序。
1.1.1 LinkedHashMap(有序但只是插入的顺序)
LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致
1.2 Hashtable(线程安全|无序无重复不支持Null值,继承于Dictionary(已废弃))
相较于HashMap除了继承于不同抽象类以及对Null值的支持与否区别外,还在于对于大小的选择上,HashTable在增容时会选用素数,这对Hash后顺序分布均匀有较大作用,而HashMap则是选择2的幂次方作为容量,虽然会导致分布不均,但是在Hash速度上明显优于Hashtable(在Hash的时候不需要做除法只需要位的与运算,而位运算速度是快于普通的运算的)
1.2.1 Properties
对于我来讲Properties是一个工具类(自认为),但是由于它是继承于HashTable,利用HashTable来维护属性表,因此也归并到容器类里面来。
通过读取(内存或文件中)属性来维护一个HashTable。
1.3 SortMap(接口)
1.3.1 TreeMap(非同步线程不安全有序|基于红黑树进行维护的Map)
红黑树详解红黑树
简单来说红黑树是一颗二叉查找树,通过维护其顺序(遍历顺序LRM)从而达到遍历时间复杂度o(logn)。
1.4 WeakHashMap
WeakHashMap与HashMap的用法基本相似。区别在于,HashMap的key保留了对实际对象的”强引用“,这意味着只要该HashMap对象不被销毁,该HashMap所引用的对象就不会被垃圾回收。
但WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,当垃圾回收了该key所对应的实际对象之后,WeakHashMap也可能自动删除这些key所对应的key-value对
1.5 IdentityHashMap
IdentityHashMap的实现机制与HashMap基本相似,在IdentityHashMap中,当且仅当两个key严格相等(key1 == key2)时,IdentityHashMap才认为两个key相等
1.6 EnumMap(key部分类似于EnumMap)
EnumMap是一个与枚举类一起使用的Map实现,EnumMap中所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式或隐式指定它对应的枚举类。
EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑、高效。
EnumMap根据key的自然顺序(即枚举值在枚举类中的定义顺序)来维护来维护key-value对的次序。当程序通过keySet()、entrySet()、values()等方法来遍历EnumMap时即可看到这种顺序。
EnumMap不允许使用null作为key值,但允许使用null作为value。如果试图使用null作为key将抛出NullPointerException异常。如果仅仅只是查询是否包含值为null的key、或者仅仅只是使用删除值为null的key,都不会抛出异常。
本文部分借鉴于:Java集合类
该总结的容器线程安全均为同步线程安全,基于synchronized声明。Java仍然有一些其余的线程安全容器
Java线程安全容器