Hashtable 基本用法及其与 HashMap 的区别

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 的主要区别
  1. 线程安全性

    • Hashtable 是线程安全的,所有方法都同步(synchronized),适合多线程环境。
    • HashMap 不是线程安全的,如果需要在多线程环境下使用,应当手动同步或使用 Collections.synchronizedMap 方法。
  2. null 键和值

    • Hashtable 不允许 null 键或 null 值,插入 null 会抛出 NullPointerException
    • HashMap 允许一个 null 键和多个 null 值。
  3. 性能

    • 由于同步开销,Hashtable 的性能通常比 HashMap 低。
    • HashMap 性能较高,但在多线程环境下需要额外的同步措施。
  4. 继承结构

    • Hashtable 继承自 Dictionary 类(一个过时的类)。
    • HashMap 继承自 AbstractMap 类,是 Java Collections Framework 的一部分。
  5. 初始容量和负载因子

    • 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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值