美文网首页
面试知识点—HashMap和Hashtable的比较

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

作者: Android高级开发 | 来源:发表于2018-12-24 21:02 被阅读11次

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

    相关文章

      网友评论

          本文标题:面试知识点—HashMap和Hashtable的比较

          本文链接:https://www.haomeiwen.com/subject/dwdtlqtx.html