面试常问的HashMap和HasheTalbe

我的习惯,首先了解它,咱们先来看看什么是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…

相关文章
相关标签/搜索