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要新,效率可能会更高一些。
网友评论