HashMap 和 Hashtable 之间的区别2025 年 6 月 4 日 | 阅读 4 分钟 HashMapHashMap 属于 Java 集合框架的一部分,位于 java.util 包中。它是一个非同步的 Map 接口实现,允许 null 键和值。HashMap 存储键值对,并利用哈希来实现 put() 和 get() 等基本操作的常数时间性能。 要记住的重要事项- Java HashMap 根据键存储值。
- Java HashMap 只包含唯一的键。
- Java HashMap 可能有一个 null 键和多个 null 值。
- Java HashMap 是非同步的。
- Java HashMap 不维护任何顺序。
- Java HashMap 类的初始默认容量为 16,负载因子为 0.75。
阅读更多 Java HashMap HashMap 示例输出 HashMap: {null=NullKey, 1=Apple, 2=Banana, 3=Cherry, 4=null} HashtableHashtable 也属于旧的集合类的一部分,存在于 java.util 包中。与 HashMap 不同,Hashtable 是同步的,这使其具有线程安全性,但也相对较慢。它不允许 null 键或 null 值。 要记住的重要事项- Hashtable 是一个列表数组。每个列表称为一个桶。桶的位置通过调用 hashcode() 方法来标识。Hashtable 根据键存储值。
- Java Hashtable 类包含唯一的元素。
- Java Hashtable 类不允许 null 键或值。
- Java Hashtable 类是同步的。
- Hashtable 类的初始默认容量为 11,而负载因子为 0.75。
阅读更多 Java Hashtable 输出 Hashtable: {3=Rabbit, 2=Cat, 1=Dog} HashMap vs. HashtableHashMap | Hashtable |
---|
HashMap 是非同步的。它不是线程安全的,在没有适当的同步代码的情况下不能在多个线程之间共享。 | Hashtable 是同步的。它是线程安全的,可以与多个线程共享。 | HashMap允许一个 null 键和多个 null 值。 | Hashtable不允许任何 null 键或值。 | HashMap 是JDK 1.2 中引入的新类。 | Hashtable 是旧类。 | HashMap速度快。 | Hashtable速度慢。 | 我们可以通过调用此代码使 HashMap 同步 Map m = Collections.synchronizedMap(hashMap); | Hashtable 是内部同步的,无法取消同步。 | HashMap 由 Iterator 遍历。 | Hashtable 由 Enumerator 和 Iterator 遍历。 | HashMap 中的 Iterator 是快速失败的。 | Hashtable 中的 Enumerator不是快速失败的。 | HashMap 继承了AbstractMap类。 | Hashtable 继承自Dictionary类。 | 使用 LinkedHashMap(子类)可以保留插入顺序。 | 没有等效的子类来保留插入顺序。 | 属于 Java 集合框架,实现了 Map 接口。 | 属于旧的集合类,也实现了 Map 接口。 | 它支持 Java 8 的 lambda 表达式和 Stream API。 | 由于是旧类,函数式编程支持有限。 | 适用于非线程应用或在需要时进行外部同步。 | 仅在需要线程安全性的遗留代码库中推荐使用。 | 通过使用 ConcurrentHashMap,在并发应用程序中提供更好的可伸缩性。 | 不推荐将 Hashtable 用于高并发应用程序。 | 它可以使用 Java 8 引入的 compute()、merge() 和 forEach() 方法。 | 由于是旧类,缺乏高级的 Java 8 增强功能。 | 它没有内置的遗留方法,如 elements() 或 keys()。 | 它提供了 Dictionary 中的遗留方法,如 elements() 和 keys()。 | 由于非同步操作,内存效率高。 | 由于同步开销,内存占用更高。 |
HashMap 和 Hashtable 选择题1. 以下关于 HashMap 的说法哪个是正确的? - HashMap 是同步的
- HashMap 允许多个 null 键
- HashMap 是旧类的一部分
- HashMap 允许一个 null 键和多个 null 值
答案:D) 解释: HashMap 允许一个 null 键和任意数量的 null 值。它不是同步的,并且作为集合框架的一部分在 Java 1.2 中引入。
2. 以下哪个在 Hashtable 中不允许? - Null 键
- Null 值
- A 和 B 均可
- 具有相同值的多个条目
答案:C) 解释: Hashtable 不允许 null 键或 null 值。尝试插入其中任何一个都会导致 NullPointerException。
3. 哪个方法可用于同步 HashMap? - Map m = new Hashtable();
- Map m = Collections.synchronizedMap(hashMap);
- makeSynchronized();
- synchronize();
答案:B) 解释: 您可以使用 Collections.synchronizedMap(Map) 来使 HashMap 同步。
4. 哪个遍历方法是快速失败的? - Hashtable 中的 Enumerator
- Hashtable 中的 Iterator
- HashMap 中的 Iterator
- A 和 C 均可
答案:C) 解释: HashMap 中使用的 Iterator 是快速失败的,这意味着如果 Map 在迭代过程中被修改(除了通过迭代器本身),它将抛出 ConcurrentModificationException。Hashtable 中的 Enumerator 不是快速失败的。
5. Hashtable 继承自哪个类? - Map
- AbstractMap
- 字典
- AbstractCollection
答案:C) 解释: Hashtable 是一个旧类,它继承自 Dictionary 类,而 HashMap 继承自 AbstractMap。 |