面试常问的HashMap和HasheTalbe

315 阅读2分钟

个人习惯,首先了解它,我们先来看看什么是HashMap和HasheTalbe

哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。

简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

类比于HashTable,而HashTalbe是线程安全的,效率较低的Hash数组。

下面,我们来具体看看二者:

一、HashMap与HashTable的区别:

1.HashMap是非线程安全的,HashTable是线程安全的,HashTable中的很多方法都是加了sysnchronized关键字的,确保了方法的同步;

2.HashMap可以接受空key和value,而HashTable不能接受空key和value;

3.由于HashMap是异步执行,而HashTable是同步执行,所以在单线程环境下,HashMap的速度高于HashTable;

4.HashMap的迭代器采用的是Iterator,Iterator是快速失败(Fail-Fast),在遍历过程中若有其他线程对该HashMap进行增加或者删除元素,则会抛出ConcurrentModificationException,因为快速失败的迭代器是操作的集合本身,

HashTable的迭代器是Enumeration,Enumeration是安全失败(Fail-Safe),在遍历过程中若有其他线程对该集合进行增加或则删除元素,不会抛出ConcurentModificationException,因为安全失败的迭代器操作的是原集合的一个拷贝。

二、HashTable和ConcurrentHashMap的区别:

在进行迭代时,HashTable会锁住整个Map,而ConcurrentHashMap只锁住Map的一部分,所以ConcurrentHashMap在多线程环境下的性能更好。

三、如何使用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…