【正确答案】
A、C、D
【答案解析】 HashMap和Hashtable通过对象来进行索引,用来索引的对象叫作key,其对应的对象叫作value。二者具有许多相似之处,但也有很多不同之处。以下重点介绍二者的不同之处,具体而言,它们的不同之处体现在以下几个方面:
1)它们都实现了Map接口,HashMap允许空(null)键值(key)(但需要注意的是,最多只允许一条记录的键为null,不允许多条记录的值为null),而Hashtable不允许。
2)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。
3)Hashtable的方法是线程安全的,而HashMap不是线程安全的。当多个线程访问Hashtable时,不需要开发人员对它进行同步,而对于HashMap,开发人员必须提供额外的同步机制。所以,效率上HashMap可能高于Hashtable。
4)“快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变操作时,就有可能会产生fail-fast事件。例如,假设存在两个线程,它们分别是线程1与线程2,当线程1通过Iterator(迭代器)在遍历集合A中的元素时,如果线程2修改了集合A的结构(删除或增加新的元素),那么,此时程序就会抛出ConcurrentModificationException异常,从而产生fail-fast事件。
由于Hashtable是线程安全的,因此,没有采用快速失败机制,而HashMap是非线程安全的,迭代HashMap采用了快速失败机制。
从以上分析可知,选项A、选项C、选项D的描述都是正确的,只有选项B的描述不正确,因为Hashtable不允许键值为null。
所以,本题的答案为ACD。