Map
Java 中的映射类型

下面针对各个实现类的特点做一些说明:
-
HashMap:它根据键的
hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。HashMap 最多只允许一条记录的键为null ,允许多条记录的值为null 。HashMap 非线程安全,即任一时刻可以有多个线程同时写HashMap ,可能会导致数据的不一致。如果需要满足线程安全,可以用Collections 的synchronizedMap 方法使HashMap 具有线程安全的能力,或者使用ConcurrentHashMap 。 -
Hashtable:
Hashtable 是遗留类,很多映射的常用功能与HashMap 类似,不同的是它承自Dictionary 类,并且是线程安全的,任一时间只有一个线程能写Hashtable ,并发性不如ConcurrentHashMap ,因为ConcurrentHashMap 引入了分段锁。Hashtable 不建议在新代码中使用,不需要线程安全的场合可以用HashMap 替换,需要线程安全的场合可以用ConcurrentHashMap 替换。 -
LinkedHashMap:
LinkedHashMap 是HashMap 的一个子类,保存了记录的插入顺序,在用Iterator 遍历LinkedHashMap 时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。 -
TreeMap:
TreeMap 实现SortedMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap 时,得到的记录是排过序的。如果使用排序的映射,建议使用TreeMap 。在使用TreeMap 时,key 必须实现Comparable 接口或者在构造TreeMap 传入自定义的Comparator ,否则会在运行时抛出java.lang.ClassCastException 类型的异常。
对于上述四种
集合中的key
集合类 | key | value | super | 说明 |
---|---|---|---|---|
HashTable | 不能为 |
不能为 |
Dictionary | 线程安全 |
ConcurrentHashMap | 不能为 |
不能为 |
AbstractMap | 线程局部安全 |
TreeMap | 不能为 |
可以为 |
AbstractMap | 线程不安全 |
HashMap | 可以为 |
可以为 |
AbstractMap | 线程不安全 |