Hashtable
和
HashMap
都是 Java 中用于存储键值对的集合类,但它们之间存在一些重要的差异。以下是它们之间的主要区别以及代码示例:
-
同步性(Synchronization):
Hashtable
是同步的,意味着它在多线程环境中是线程安全的。但是,这也使得它在单线程环境中性能略低。HashMap
不是同步的,因此在多线程环境中可能会遇到并发问题。但在单线程环境中,它的性能通常更好。
-
对 null 键值对的处理:
Hashtable
不允许使用 null 键或 null 值。HashMap
允许使用 null 键和 null 值。
-
继承关系:
Hashtable
继承自Dictionary
类,实现了Map
接口。HashMap
实现了Map
接口。
-
迭代顺序:
Hashtable
不保证映射的顺序,特别是它不保证该顺序恒久不变。HashMap
同样不保证映射的顺序,但在 Java 8 及其之后的版本中,它根据键的哈希码进行排序(在桶内使用链表或红黑树)。
代码示例
Hashtable 示例
import java.util.Hashtable;
public class HashtableExample {
public static void main(String[] args) {
Hashtable<String, Integer> hashtable = new Hashtable<>();
// 注意:Hashtable 不允许 null 键或值
// hashtable.put(null, 1); // 这会抛出 NullPointerException
// hashtable.put("key", null); // 这也会抛出 NullPointerException
hashtable.put("one", 1);
hashtable.put("two", 2);
hashtable.put("three", 3);
// 遍历 Hashtable
for (Map.Entry<String, Integer> entry : hashtable.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
}
HashMap 示例
下滑查看解决方法
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
HashMap<String, Integer> hashMap = new HashMap<>();
// HashMap 允许 null 键和值
hashMap.put(null, 1); // 这是有效的
hashMap.put("key", null); // 这也是有效的
hashMap.put("one", 1);
hashMap.put("two", 2);
hashMap.put("three", 3);
// 遍历 HashMap
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
}
请注意,虽然 HashMap
允许 null 键和值,但在实际编程中应谨慎使用它们,因为它们可能会导致意外的行为或错误。