文
章
目
录
章
目
录
Java面试题:谈谈HashMap和Hashtable之间的区别
得分点:
线程安全、null
标准回答:
HashMap和Hashtable都是Map接口的实现,它们的主要区别在于线程安全性和对null值的处理。
线程安全性
- Hashtable:Hashtable是线程安全的,它在实现时采用了同步机制来确保多线程环境下的线程安全。因此,多个线程可以同时操作一个Hashtable,而不会导致数据不一致或其他并发问题。然而,这种线程安全性是通过在方法级别添加同步块来实现的,会影响性能。
- HashMap:HashMap是非线程安全的,它不提供对多线程的同步支持。如果多个线程同时访问一个HashMap,并且至少一个线程修改了HashMap的结构(添加、删除元素),则必须采取额外的同步措施来确保线程安全,否则可能会导致不确定的行为或数据不一致性。要在多线程环境中使用线程安全的Map,通常使用
ConcurrentHashMap
。
对null值的处理
- Hashtable:Hashtable不允许存储null值,无论是作为键(key)还是值(value),如果尝试存储null值,会抛出
NullPointerException
。 - HashMap:HashMap允许存储null值,可以将null作为键或值存入HashMap中,不会引发异常。
需要注意的是,虽然Hashtable是线程安全的,但不建议在新代码中使用它,因为它的同步机制影响性能。对于线程安全的需求,更推荐使用ConcurrentHashMap
,它在多线程环境下提供了更好的性能和可伸缩性。HashMap适用于单线程环境或者多线程环境下采取适当同步措施的情况。