面试知识点—HashMap和Hashtable的比较

2018-12-24  本文已影响11人  Android高级开发

HashMap和Hashtable的比较也是Android面试过程中考察Java基础知识的常见问题,面试者常用它来考验程序员是否能够正确的使用集合类解决问题。所以在参加任何Java相关的面试之前,都应该好好准备一下这一道面试题。

我们先来介绍一下两者的相同点,然后再比较一下不同之处。

相同点:

1、元素种类

它们都是键值对容器,容器中的元素对应的键和值都要是对象,而不应该是基本数据类型的数据,比如不应该是int,char类型,应该是Integer,Char类型的对象。并且不能包含重复键(key),但可以包含重复值(value);

2、内部实现算法

Hashtable和HashMap采用的hash/rehash算法基本都一样;

3、实现的接口

它们都实现了Map接口;

不同点:

1、线程同步和安全方面

HashTable是JDK1.0引就引入的第一个关联集合类,它是线程安全的,它的所有方法都是线程同步的。而HashMap是JDK2.0才引入的集合类,它是非线程同步的,所以效率上比HashTable要高。所以这个区别和Vector和ArrayList是相同的。

HashMap提供了一个不同步的基类AbstractMap和一个同步的包装器synchronizedMap。synchronizedMap被称为有条件的线程安全类,利用它可以实现线程安全。

方法是,

Map m = Collections.synchronizedMap(new HashMap());

另外,在JDK5.0上,util.concurrent包中引入一个新的HashMap类型--ConcurrentHashMap,它可以对线程起到安全作用,比起synchronizedMap, 它提供了更高的灵活性,同时进行的读和写操作都可以并发地执行。用它可以完全替代掉synchronizedMap方式。

同时,util.concurrent包也提供了一个线程安全的CopyOnWriteArrayList用来替代ArrayList。

2、键值类型

HashTable不允许有null值,无论key和value都不可以,而HashMap允许有null值,并且key和value都可以。但是HashMap允许 key值只能有一个null值,因为HashMap的key值是唯一的,如果出现相同的key值,则新的key对应的value将替代旧的value。

3、包含的方法

HashTable有一个contains(Object value)方法,而HashMap去掉了contains方法,但是加上了containsValue(Object value)和containsKey(Object key)这两个方法。

4、迭代器差异

遍历的时候,HashTable使用Enumeration,HashMap使用Iterator。

HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的迭代器(Enumeration)不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,因为它是线程不安全的。

5、基类不同

Hashtable继承自Dictionary类,实现了Map接口。而HashMap是继承自AbstractMap,也实现了Map接口。

6、元素递增方式不同

HashTable中hash数组默认大小是11,增加的方式是 old2+1。而HashMap中hash数组的默认大小是16,增加方式old2。

综上,如果用在单线程环境下应该使用HashMap,因为它不需要考虑线程同步,速度会比较快。如果用在多线程环境,并且开发环境是Java 5或以上的话,可以考虑使用ConcurrentHashMap,它比HashTable要新,效率可能会更高一些。

上一篇下一篇

猜你喜欢

热点阅读