Java中HashMap和HashTable的区别
已发表: 2021-06-02如果您正在学习 Java 及其应用程序,那么您一定遇到过 HashMap 和 HashTable。 它们都是 Java Collection 框架中最重要的类之一。 在使用 Java 进行开发时,您将广泛使用它们,这就是为什么了解它们的差异至关重要的原因。
在以下几点中,我们将详细介绍 HashTable 与 HashMap 主题并解释两者之间的区别:
目录
什么是哈希映射?
自 Java 1.2 引入以来,HashMap 一直在 Java 的集合中。 它允许您执行 Java 的 Map 接口的基本实现。 HashMap 将数据存储在 (Key, Value) 对中,要访问它们,您必须使用另一种类型的索引,例如整数。
在这里,您使用一个对象作为另一个对象(值)的键(索引),因此使用(键,值)对。 如果添加重复键,它将替换相应键的元素。
HashMap的特点
要了解 HashTable 与 HashMap 之间的区别,首先必须了解它们的特性。 这将使您熟悉它们的基础知识。 HashMap 具有以下特点:
- 它是 java.util 包的一部分。
- 它扩展了一个抽象类 AbstractMap,它提供了 Map 接口的不完整实现。
- 除了实现 Map 接口,它还实现了 Serializable 和 Cloneable 接口。
- 它允许重复值,但不允许重复键。 这意味着一个键不能有多个值,但多个键可以有一个值。
- 在 HashMap 中只能使用一次 null 键,但可以使用多个 null 值。
- 它不保证地图的顺序,特别是顺序是否会随着时间的推移保持不变。 HashMap 与 HashTable 几乎相似,但不同步。
- HashSet 在内部使用 HashMap。
什么是哈希表?
您使用 HashTable 类来实现将键映射到值的哈希表。 在这里,您可以使用非空对象作为键或值。 请记住,要成功地从哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
哈希表以数组格式存储数据,每个数据值都有唯一的索引值。 如果您知道所需的索引,这允许您非常快速地访问特定数据。
哈希表的特点
HashTable 有其独特的特性,就像 HashMap 一样。 但是,这些特性使其在许多方面都与 HashMap 不同:
- HashTable 与 HashMap 非常相似,但是是同步的。
- 它将键值对存储在哈希表中。
- 在这里,您指定一个用作键的对象和您要与之关联的值。 然后你散列键并使用生成的散列码作为你在表中存储值的索引。
- Hashtable类的默认容量是11,加载因子是0.75。
- HashMap 不提供枚举,而 Hashtable 不提供快速失败枚举。
HashMap 和 HashTable 的区别
既然您知道了 HashMap 和 HashTable 的特别亮点,我们现在将它们进行比较,看看两者之间的显着差异:
哈希映射 | 哈希表 |
它是非同步的。 如果不使用适当的同步代码,您将无法在此处共享多个线程,因为它不是线程安全的。 | 它是同步的。 您可以与许多线程共享它,因为它是线程安全的。 |
它继承了 AbstractMap 类。 | 它继承了 Dictionary 类。 |
在这里,迭代器是快速下降的。 | 在 HashTable 中,枚举器不是快速下降的。 |
Iterator 遍历 HashMap。 | Enumerator 和 Iterator 遍历 HashTable。 |
您可以通过调用代码使 HashMap 同步 地图 m = Collections.synchronisedMap(hashMap); | 哈希表在内部是同步的,您不能使用任何代码取消同步它们。 |
它相当快。 | 它比 HashMap 相对慢。 |
HashMap 是一个新类,最近在 JDK 1.2 中引入。 | HashTable 是一个遗留类。 |
它允许多个空值和一个空键。 | 它不允许任何空值或键。 |
编码示例
以下是 HashMap 和 HashTable 的工作示例,以便您了解 HashMap 与 HashTable 的区别。
输入:
导入 java.util.*;
导入java.lang.*;
导入java.io.*;
公共类 JavaTester{
公共静态无效主要(字符串参数[]){
哈希表 ht=新哈希表();
ht.put(1,"Uday");
ht.put(1,"Ujjwal");
ht.put(2,"Sumit");
ht.put(3,”维杰”);
System.out.println(“————-哈希表————”);
Set<Integer> keySet = ht.keySet();
对于(整数键:keySet){
System.out.println(key + ” “+ht.get(key));
}
HashMap hm=new HashMap();
hm.put(0,"Uday");
hm.put(4,"Uday"); // 你可以在哈希图中有重复的值
hm.put(1,”Sumit”);
hm.put(2,”维杰”);
System.out.println(“———–哈希图———–“);
Set<Integer> keySet1 = ht.keySet();
对于(整数键:keySet){
System.out.println(key + ” “+hm.get(key));
}
}
}
输出:
哈希表:
3 维杰
2 苏米特
1 乌吉瓦尔
哈希图:
0 乌代
1 顶峰
2维杰
4 乌代
何时使用 HashMap 与 HashTable?
决定是否使用 HashMap 或 HashTable 的主要因素是同步。 如果您需要线程安全的任务,那么您应该使用 HashTable,因为它的所有方法都是同步的。 但是,它是一个遗留类,您应该避免使用它们。
如果您有一个多线程环境,您应该使用 ConcurrentHashMap,因为它与 HashTable 非常相似。 它允许您正确同步 HashMap。
同步操作会导致性能不佳,因此在大多数情况下应避免使用它们。 此外,HashMap 适合非线程环境,因此您可以轻松使用它。
从世界顶级大学在线学习软件课程。 获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。
结论
HashMap 和 HashTable 是具有相似功能的流行 Java 代码。 但是,如您所见,两者之间存在一些显着差异。 HashMap 是一个 Java 类,而 HashTable 是一个数据结构。
如果您有兴趣了解有关 Java 和其他编程语言的更多信息,我们建议您查看我们的Executive PG Program in Software Development with Specialization in Full Stack Development 。
什么是哈希表?
哈希表是一种在计算机编程中广泛使用的容器数据结构。 哈希表用于保存键值对,其中键可以是任何对象。 作为一个容器,哈希表应该支持插入和删除操作。 作为查找工具,哈希表应该支持get的操作。 如果一个哈希表应该是一个字典数据结构,它也应该支持包含的操作。 所以,总的来说,哈希表是一种广泛用于有效实现插入、删除、获取和包含操作的数据结构。 哈希表因其快速的性能而被广泛使用。
Java 中的集合框架是什么?
Java Collections Framework 是一组用于 Java 平台的接口、类和算法。 自 1.2 版以来,它一直是 Java 平台的一部分。 它包括容器、列表、队列等的接口,但它还包括处理日期和时间的类、处理正则表达式的类、处理国际化的类以及处理文件搜索的类。
Java中的hashtable和hashmap之间有什么关系?
哈希表是一种特殊的数据结构,它将键与值相关联。 键可以是任何对象,但给定哈希表中的所有键必须彼此可比较(即,使用相同或兼容的接口)。 在 Java 中,映射是使用 TreeMap 实现的一种特定类型的哈希表。 map中的key必须实现equals方法,map使用这个方法判断两个key是否相等。 这意味着只有键存储在映射中,并且在需要时计算它们的关联值。