Hashtable
基本用法
Hashtable
是一个线程安全的键值对存储容器。它不允许 null
键或 null
值,并且在多线程环境下表现良好。下面是一个基本的 Hashtable
示例:
代码示例
import java.util.Hashtable;
import java.util.Enumeration;
public class HashtableExample {
public static void main(String[] args) {
// 创建一个Hashtable实例
Hashtable<String, Integer> hashtable = new Hashtable<>();
// 向Hashtable中添加键值对
hashtable.put("Apple", 3);
hashtable.put("Orange", 2);
hashtable.put("Banana", 5);
// 尝试插入null键或null值会抛出NullPointerException
// hashtable.put(null, 1); // 抛出NullPointerException
// hashtable.put("Grapes", null); // 抛出NullPointerException
// 获取并打印Hashtable中的值
System.out.println("Value for key 'Apple': " + hashtable.get("Apple"));
// 检查某个键或值是否存在
System.out.println("Contains key 'Orange': " + hashtable.containsKey("Orange"));
System.out.println("Contains value 5: " + hashtable.containsValue(5));
// 遍历Hashtable中的键值对
Enumeration<String> keys = hashtable.keys();
while (keys.hasMoreElements()) {
String key = keys.nextElement();
Integer value = hashtable.get(key);
System.out.println(key + " : " + value);
}
// 删除一个键值对
hashtable.remove("Banana");
System.out.println("After removing 'Banana': " + hashtable);
}
}
输出结果
Value for key 'Apple': 3
Contains key 'Orange': true
Contains value 5: true
Apple : 3
Orange : 2
Banana : 5
After removing 'Banana': {Apple=3, Orange=2}
Hashtable
与 HashMap
的主要区别
-
线程安全性:
Hashtable
是线程安全的,所有方法都同步(synchronized),适合多线程环境。HashMap
不是线程安全的,如果需要在多线程环境下使用,应当手动同步或使用Collections.synchronizedMap
方法。
-
null
键和值:Hashtable
不允许null
键或null
值,插入null
会抛出NullPointerException
。HashMap
允许一个null
键和多个null
值。
-
性能:
- 由于同步开销,
Hashtable
的性能通常比HashMap
低。 HashMap
性能较高,但在多线程环境下需要额外的同步措施。
- 由于同步开销,
-
继承结构:
Hashtable
继承自Dictionary
类(一个过时的类)。HashMap
继承自AbstractMap
类,是 Java Collections Framework 的一部分。
-
初始容量和负载因子:
Hashtable
的默认初始容量是11,且扩容时容量加倍+1。HashMap
的默认初始容量是16,且扩容时容量加倍。
HashMap
基本用法
为了更清晰地展示 HashMap
的用法,下面附上一个 HashMap
的基本示例:
代码示例
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
// 创建一个HashMap实例
Map<String, Integer> hashMap = new HashMap<>();
// 向HashMap中添加键值对
hashMap.put("Apple", 3);
hashMap.put("Orange", 2);
hashMap.put("Banana", 5);
hashMap.put(null, 1); // 允许null键
hashMap.put("Grapes", null); // 允许null值
// 获取并打印HashMap中的值
System.out.println("Value for key 'Apple': " + hashMap.get("Apple"));
// 检查某个键或值是否存在
System.out.println("Contains key 'Orange': " + hashMap.containsKey("Orange"));
System.out.println("Contains value 5: " + hashMap.containsValue(5));
// 遍历HashMap中的键值对
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
// 删除一个键值对
hashMap.remove("Banana");
System.out.println("After removing 'Banana': " + hashMap);
}
}
输出结果
Value for key 'Apple': 3
Contains key 'Orange': true
Contains value 5: true
null : 1
Apple : 3
Orange : 2
Banana : 5
Grapes : null
After removing 'Banana': {null=1, Apple=3, Orange=2, Grapes=null}