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}

相关推荐

  1. Hashtable 基本用法及其 HashMap 区别

    2024-06-17 13:12:03       38 阅读
  2. HashmapHashtable区别

    2024-06-17 13:12:03       38 阅读
  3. HashMapHashtable区别(绝对经典)

    2024-06-17 13:12:03       60 阅读
  4. HashMapHashtable区别底层原理

    2024-06-17 13:12:03       34 阅读
  5. HashMapHashTable异同

    2024-06-17 13:12:03       32 阅读
  6. HashMapHashtable 有什么区别

    2024-06-17 13:12:03       41 阅读
  7. HashTable和ConcurrentHashMap区别

    2024-06-17 13:12:03       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 13:12:03       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 13:12:03       97 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 13:12:03       78 阅读
  4. Python语言-面向对象

    2024-06-17 13:12:03       88 阅读

热门阅读

  1. Apache网页优化

    2024-06-17 13:12:03       34 阅读
  2. 创建Docker容器与外部机通信(端口映射的方式)

    2024-06-17 13:12:03       33 阅读
  3. 前端开发之计算机网络模型认识

    2024-06-17 13:12:03       26 阅读
  4. 掌握现代C++的模板元编程类型检测技术

    2024-06-17 13:12:03       24 阅读
  5. LINUX 进阶 3.1

    2024-06-17 13:12:03       33 阅读