java中HashMap、HashTable、CurrentHashMap的区别
首先我们要知道有两种形式的集合。继承于collection接口的集合,继承于map的接口的集合。
我们这里讨论的都是继承map接口的结合,以(key,value)的形式存储数据。实际上后缀是map的集合类最终实现的都是
map接口。
HashMap是我们比较常用的数据结构,我们可以通过HashMap的用迭代器(iterator)方法得到迭代器来进行遍历HashMap
或者用foreach遍历HashMap。HashMap在jdk1.7中底层采用的是链表拉链法,1.8中采用的数据结构是红黑树。HashMap
允许有null值。key或者value可以为空。但是HashMap是线程不安全的,多个线程对HashMap进行写操作的时候,可能会
出错。
Hashtable可以用迭代器(iterator)方法得到迭代器来进行遍历hashtable,或者用foreach遍历Hashtable。Hashtable是线程
安全的。不允许有空值。我们看Hashtable的源码可以知道在set,get函数等会有同步锁。保证线程安全
ConcurrentHashMap是在Java 5提供的,ConcurrentHashMap是对hashtable的改进,ConcurrentHashMap除了拥有
Hashtable的操作,还在性能上进行优化,因为Hashtable在同步时锁住整个map,而ConcurrentHashMap只锁住了
要操作的部分。所以在数据量很大的时候,可以感觉到ConcurrentHashMap的处理效率是远高于Hashtable的。
总结:在数据量较小,不追求性能的情况下,用哪种数据结构都可以,可以在多线程情况下用HashMap,我们手动上
个锁就ok,也可以用Hashtable或者ConcurrentHashMap。
在要处理的数据量较大,要求处理效率的时候,在单线程的情况下,HashMap的处理效率是最快的,所以HashMap是
优先选择。在多线程的情况下,建议用ConcurrentHashMap代替Hashtable。