
HashMap 和 Hashtable 都是 Java 中用于存储键值对的集合类,但它们之间存在一些重要的区别。以下是它们的主要区别:
HashMap 是非线程安全的,这意味着在多线程环境下使用 HashMap 可能会导致数据不一致的问题。Hashtable 是线程安全的,所有的方法都进行了同步处理,因此在多线程环境下可以安全使用。HashMap 不进行同步处理,所以在单线程环境下性能更好。Hashtable 由于所有方法都进行了同步处理,所以在多线程环境下性能较差。HashMap 允许一个 null 键和多个 null 值。Hashtable 不允许 null 键和 null 值,如果尝试插入 null 键或 null 值,会抛出 NullPointerException。HashMap 返回的迭代器是 fail-fast 的,这意味着如果在迭代过程中集合被修改(除了迭代器自身的 remove 方法),迭代器会抛出 ConcurrentModificationException。Hashtable 返回的枚举器(Enumeration)也是 fail-fast 的,但在早期版本的 Java 中可能不是这样。HashMap 实现了 Map 接口。Hashtable 实现了 Dictionary 接口,这是一个过时的接口。HashMap 的默认初始容量是 16,负载因子是 0.75。Hashtable 的默认初始容量是 11,负载因子是 0.75。HashMap 提供了多种构造函数,包括指定初始容量和负载因子的构造函数。Hashtable 也提供了类似的构造函数,但不如 HashMap 灵活。import java.util.HashMap;
import java.util.Hashtable;
public class HashMapVsHashtable {
public static void main(String[] args) {
// 创建 HashMap
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("key1", "value1");
hashMap.put("key2", "value2");
hashMap.put(null, "value3"); // 允许 null 键
hashMap.put("key4", null); // 允许 null 值
// 创建 Hashtable
Hashtable<String, String> hashtable = new Hashtable<>();
hashtable.put("key1", "value1");
hashtable.put("key2", "value2");
// hashtable.put(null, "value3"); // 抛出 NullPointerException
// hashtable.put("key4", null); // 抛出 NullPointerException
System.out.println("HashMap: " + hashMap);
System.out.println("Hashtable: " + hashtable);
}
}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。