HashMap和Hashtable有什么不同呢?
下文笔者将列举HashMap和Hashtable的区别,如下所示
区别1:父类不同
HashMap 继承自 AbstractMap Hashtable 继承自 Dictionary
线程安全性不同
HashMap 线程不安全 Hashtable 线程安全 因为Hashtable中的方法是同步的(Synchronize) 注意:同步的代价就是性能损失,非线程安全场景 建议使用 HashMap
key、value 是否允许null?
HashMap 的 key 和 value 都可以为 null key 只允许一个 null; Hashtable 的 key 和 value 都不能为 null
迭代器不同
HashMap 的 Iterator 是 fail-fast 迭代器 Hashtable 还是使用 enumerator 迭代器
什么是 fail-fast?
fail-fast 机制是 java 集合中的一种错误机制。 当多个线程对同一个集合的内容进行操作时 可能会产生 fail-fast 事件。例如:当某一个线程 A 通过 iterator 去遍历某集合的过程中, 若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出 ConcurrentModificationException 异常,产生 fail-fast 事件
hash 的计算方式不同
HashMap 计算了 hash 值; HashMap 中最核心的部分就是哈希函数,又称散列函数 哈希函数是通过把 key 的 hash 值映射到数组中的一个位置来进行访问。 Hashtable 使用了 key 的 hashCode 方法;
默认初始大小和扩容方式不同
HashMap 默认初始大小 16,容量必须是 2 的整数次幂, 扩容时将容量变为原来的2倍; Hashtable 默认初始大小 11, 扩容时将容量变为原来的 2 倍加 1
是否有 contains 方法?
HashMap 没有 contains 方法 但添加containsValue() 和 containsKey() 方法; Hashtable 包含contains方法,其功能类似于containsValue
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。