Java 中 HashMap 和 HashTable 有什么区别
java 8object oriented programmingprogramming更新于 2025/11/25 21:32:17
HashMap 和 HashTable 都是 Java 集合框架中最重要的类之一。HashMap 和 HashTable 都将数据存储在键值对中,存储数据时会使用哈希算法对键进行哈希处理,并将生成的哈希码用作表中存储值的索引。但是,这两个类之间仍然存在许多差异,我们将在下面讨论。
以下是 HashMap 和 HashTable 之间的重要区别。
| Sr.编号 | Key | HashMap | HashTable |
|---|---|---|---|
| 1 | 简介 | Hashmap 是 HashTable 的高级版本,在 JDK 1.2 中作为新类引入。 | 另一方面,HashTable 是遗留类,在 HashMap 之前就已引入。 |
| 2 | 内部实现 | 两个类的内部实现在某种程度上是相同的,但是 HashMap 允许一个空键和多个空值。 | HashTable 内部实现的方式不允许任何空键或空值。 |
| 3 | 同步 | HashMap 中未实现同步,并且同步不是线程安全的,因此如果没有适当的同步代码,则无法在多个线程之间共享。 | 另一方面,HashTable 是同步的并且是线程安全的,因此可以与多个线程共享。 |
| 4 | 遍历元素 | HashMap 提供 Iterator 进行迭代,以便遍历存储在其中的值。 | 另一方面,除了 Iterator 之外,HashTable 还提供了 Enumerator 来遍历存储在其中的值。 |
| 5 | 索引性能 | 由于没有同步,HashMap 与 HashTable 相比速度更快,在不需要同步时是首选。 | HashTable 中的同步使其与 HashMap 相比速度更慢,但也消除了编写额外代码来获取同步的需要。 |
| 6 | 继承 | HashMap 继承自 AbstractMap 类。 | 另一方面,HashTable 继承自 Dictionary 类。 |
HashMap 与 HashTable 示例
JavaTester.java
import java.util.*;
import java.lang.*;
import java.io.*;
public class JavaTester{
public static void main(String args[]){
Hashtable ht=new Hashtable();
ht.put(101,"John");
ht.put(101,"Jhony");
ht.put(102,"Smith");
ht.put(103,"Andy");
System.out.println("-------------Hash table--------------");
Set<Integer> keySet = ht.keySet();
for (Integer key:keySet) {
System.out.println(key + " "+ht.get(key));
}
HashMap hm=new HashMap();
hm.put(100,"John");
hm.put(104,"John"); // hash map allows duplicate values
hm.put(101,"Smith");
hm.put(102,"Andy");
System.out.println("-----------Hash map-----------");
Set<Integer> keySet1 = ht.keySet();
for (Integer key:keySet) {
System.out.println(key + " "+hm.get(key));
}
}
}
输出
-------------Hash table-------------- 103 Andy 102 Smith 101 Jhony -----------Hash map----------- 100 John 101 Smith 102 Andy 104 John

