更新时间:2023年10月24日10时46分 来源:传智教育 浏览次数:

HashMap和HashTable都是Java中用于存储键值对的数据结构,它们有很多相似之处,但也有一些重要的区别。
HashMap是非线程安全的,不适合在多线程环境中使用,因为它不提供同步机制。
HashMap允许键和值都为空(null)。
通常情况下,HashMap的性能比HashTable好,因为它不涉及同步开销。

HashMap提供了一种性能更好的迭代器(Iterator)方式,可以通过entrySet()方法获取,避免了通过keySet()或values()遍历键或值时的性能问题。
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.put("Alice", 25);
        hashMap.put("Bob", 30);
        hashMap.put("Charlie", 28);
        // 获取值
        int age = hashMap.get("Alice");
        System.out.println("Alice's age: " + age);
        // 迭代HashMap
        for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}
HashTable是线程安全的,可以在多线程环境中使用。它通过同步来保证线程安全,但这也导致了性能开销。
HashTable不允许键和值为空(null)。如果尝试插入空键或值,会抛出NullPointerException。
HashTable是一个遗留类,不建议在新代码中使用。推荐使用ConcurrentHashMap来实现线程安全的映射。
import java.util.Hashtable;
import java.util.Map;
public class HashTableExample {
    public static void main(String[] args) {
        // 创建一个HashTable
        Map<String, Integer> hashTable = new Hashtable<>();
        // 添加键值对
        hashTable.put("Alice", 25);
        hashTable.put("Bob", 30);
        hashTable.put("Charlie", 28);
        // 获取值
        int age = hashTable.get("Alice");
        System.out.println("Alice's age: " + age);
        // 迭代HashTable
        for (Map.Entry<String, Integer> entry : hashTable.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}
·如果我们需要线程安全性,可以使用HashTable,但要注意性能开销和不允许空键值的限制。
·如果不需要线程安全性,通常更好的选择是HashMap,它性能更高且允许空键值。
·对于新代码,推荐使用ConcurrentHashMap来实现线程安全的映射,它在大多数情况下比HashTable更好。