我的习惯,首先了解它,咱们先来看看什么是HashMap和HasheTalbehtml
哈希表(hash table)也叫散列表,是一种很是重要的数据结构,应用场景及其丰富,许多缓存技术(好比memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也经常出如今各种的面试题中,重要性可见一斑。面试
简单来讲,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,若是定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操做很快,仅需一次寻址便可;若是定位到的数组包含链表,对于添加操做,其时间复杂度为O(n),首先遍历链表,存在即覆盖,不然新增;对于查找操做来说,仍需遍历链表,而后经过key对象的equals方法逐一比对查找。因此,性能考虑,HashMap中的链表出现越少,性能才会越好。数组
类比于HashTable,而HashTalbe是线程安全的,效率较低的Hash数组。缓存
下面,咱们来具体看看两者:安全
1、HashMap与HashTable的区别:数据结构
1.HashMap是非线程安全的,HashTable是线程安全的,HashTable中的不少方法都是加了sysnchronized关键字的,确保了方法的同步;多线程
2.HashMap能够接受空key和value,而HashTable不能接受空key和value;异步
3.因为HashMap是异步执行,而HashTable是同步执行,因此在单线程环境下,HashMap的速度高于HashTable;memcached
4.HashMap的迭代器采用的是Iterator,Iterator是快速失败(Fail-Fast),在遍历过程当中如有其余线程对该HashMap进行增长或者删除元素,则会抛出ConcurrentModificationException,由于快速失败的迭代器是操做的集合自己,性能
HashTable的迭代器是Enumeration,Enumeration是安全失败(Fail-Safe),在遍历过程当中如有其余线程对该集合进行增长或则删除元素,不会抛出ConcurentModificationException,由于安全失败的迭代器操做的是原集合的一个拷贝。
2、HashTable和ConcurrentHashMap的区别:
在进行迭代时,HashTable会锁住整个Map,而ConcurrentHashMap只锁住Map的一部分,因此ConcurrentHashMap在多线程环境下的性能更好。
3、如何使用HashMap和HasheTalbe呢? 例如:
我想线程安全可是我又想效率高?
复制代码
能够经过把整个Map分为N个Segment(相似HashTable),能够提供相同的线程安全,可是效率提高N倍,默认提高16倍。
如何让HashMap实现同步功能?
复制代码
使用Map m = Collections.synchronizeMap(hashMap);
参考博文地址:1.blog.csdn.net/agallochmin… 2.www.cnblogs.com/chengxiao/p…