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是否相等。 这意味着只有键存储在映射中,并且在需要时计算它们的关联值。