在 Java 的集合框架中,HashMap 和 Hashtable 都是用于存储键值对的哈希表实现,但它们在设计、性能以及使用场景上存在一些显著的区别。以下是它们的主要差异:
1. 父类不同
HashMap 继承自 AbstractMap 类,而 Hashtable 继承自 Dictionary 类。尽管两者都实现了 Map、Cloneable(可复制)和 Serializable(可序列化)接口,但它们的继承结构不同,影响了它们的行为和使用方式。
2. 对外提供的接口不同
Hashtable 比 HashMap 多提供了 elements() 和 contains() 两个方法。elements() 方法继承自 Dictionary,用于返回 Hashtable 中所有值的枚举。而 contains() 方法用于判断该 Hashtable 是否包含传入的值,功能与 containsValue() 一致,实际上,containsValue() 仅是对 contains() 的调用。
3. 对 null 的支持不同
在 Hashtable 中,键和值都不能为 null。如果尝试将 null 键或值插入 Hashtable,将抛出 NullPointerException。而在 HashMap 中,键可以为 null(但只能有一个),而多个键值对的值可以为 null。
4. 安全性不同
HashMap 是线程不安全的,在多线程并发环境下可能会导致数据不一致等问题,开发人员需要自行处理线程安全。而 Hashtable 是线程安全的,所有公共方法都有 synchronized 关键字,因此可直接用于多线程环境中。尽管 HashMap 是线程不安全的,但它的效率通常高于 Hashtable。在需要线程安全的场景时,推荐使用 ConcurrentHashMap,它不仅是线程安全的,还通过分段锁机制提高了性能,远高于 Hashtable。
5. 初始容量大小和扩容策略不同
HashMap 和 Hashtable 在初始容量和扩容策略上也存在差异。HashMap 的默认初始容量为 16,负载因子为 0.75。扩容时,容量会加倍。而 Hashtable 的默认初始容量为 11,扩容时会增加到原来的 1.5 倍。这意味着在使用时,HashMap 通常会更快,因为它在扩容时更高效。
6. 计算 hash 值的方法不同
在计算 hash 值时,HashMap 和 Hashtable 使用的方法也有所不同。HashMap 采用了一种更加复杂的散列算法,以减少哈希碰撞,提高性能。Hashtable 则使用简单的哈希计算,这可能导致性能下降,尤其是在大量元素的情况下。
7. 遍历方式的不同
HashMap 提供了 entrySet()、keySet() 和 values() 等方法来遍历其内容,使用现代的迭代方式。而 Hashtable 使用 Enumeration 接口进行遍历,这种方法相对较老,不如 Iterator 直观。
代码示例
以下是一个简单的代码示例,展示了 HashMap 和 Hashtable 的基本用法:
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", null);
        System.out.println("HashMap: " + hashMap);
        // Hashtable 示例
        Hashtable<String, String> hashTable = new Hashtable<>();
        hashTable.put("key1", "value1");
        // hashTable.put(null, "value2"); // 这行代码将抛出 NullPointerException
        System.out.println("Hashtable: " + hashTable);
    }
}    
    
 
 
                     
            
        













 
                    

 
                 
                    