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 删除。