Hashmap 面试问题和答案 [适用于初学者和有经验者]

已发表: 2020-09-24

java.util.HashMap 类是迄今为止最重要的 Java 库之一。 很少有项目是用 java 编写的,并且在实现中不使用 HashMap 库。 正是这种数据结构的实现方式,使得这对于任何与 Java 相关的程序来说几乎都是必不可少的。 HashMap,在其定义中,非常简单。 HashMap 是一种使用非常表格化的方法实现的数据结构。

正确地说,如果只有一种数据结构,它应该是 HashMap。 这不仅非常有用,而且非常节省时间。 HashMap 中的简单查找只需要大约 O(1) 时间(这意味着 HashMap 中的所有查找都是在恒定时间内完成的)。 你会在 Java 的编程语言中找到许多 HashMap 的实现,例如 HashTable、concurrenthashmaps 等。但是,如果你正在寻找一个通用的实现,你不应该远离基本的 HashMap。

HashMap 的这些实现中的每一个都有自己的一组特性和用例。 如果您希望保留编写映射的顺序,您应该考虑使用 Linked HashMap。 如果您希望对您的映射进行排序,那么您应该使用 HashMap 的 TreeMap 实现,它会为您进行排序。

以类似的方式,如果您正在寻找一个碰巧是线程安全的哈希表,它也可以在并发应用程序中使用,同时保持可伸缩性,您将看到一个并发 HashMap。

如您所见,可以通过多种方式使用 HashMap。 要真正了解 HashMap 的重要性,您应该查看任何软件工程工作简介的面试问题。 如果您不知道如何正确实现 HashMap,您将无法正确优化时间。 所以,如果你是一名程序员,你就离不开学习 HashMap 的来龙去脉。 所以我们在下面列出了一些优秀的 hashmap 面试问题,这些问题应该可以帮助你为下一次面试做准备。

从世界顶级大学在线学习数据科学课程获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。

目录

Hashmap 面试问答

Q1。 你将如何在 Java 中使用 HashMap 的 put() 方法?

答。 put() 方法简单地通过利用称为散列的原理来工作。 您将使用此函数将相关对象存储到后端(这是一个内存数组)。 您必须将另一个函数与此 put() 函数一起使用,才能确定该对象在后端的确切位置。 hashcode() 函数用作 put() 的辅助函数,就像我们之前描述的那样。

因此,这两个函数协同工作的方式是它们去后端搜索可用的密钥和内存位置。 如果它们碰巧发生碰撞,则具有两个值(即键和值的值)的对象然后被添加到列表的动态实现中,也称为链表。 这里的点赞列表存储在之前找到的内存位置。

Q2。 一个对象需要具备哪些基本需求才能用作 HashMap 的键或值?

答。 我们在任何 HashMap 及其实现中使用的键和值都应该在其中编写这两个函数。 这两个函数的名字是equals()和hashcode()。 当我们在任何 HashMap 中插入键的值时,使用名为 hashcode() 的函数。 同时,只有当我们试图取回已经存储在 HashMap 中的值时,才会调用 equals() 函数。

Q3。 假设您忘记了已在 HashMap 中使用的键。 您要添加的下一个键已经存在于 HashMap 中。 你认为在这种情况下会发生什么?

答。 如果你觉得应该有错误,如果我们不讨论HashMap,你就不会错。 但是,如果您正在使用 HashMap 并且碰巧插入了一个其值已经存在于 hashmap 中的键,则 java 编译器不会抛出任何错误。 相反,编译器只会去查找与您输入的键关联的值,并且只会更新那里的值。

如果您使用函数 put() 将值添加到哈希图中,则此函数的返回值将是与该键关联的旧值。 因此,让我们假设对于键 A,您存储的值为 1。如果您现在将 A 的值设为 50,那么 put() 函数将返回的值将是 1 ,并且存储在键 A 中的最终值将是 50。

Q4。 如果需要存储空值。 在这种情况下你能使用 HashMap 吗?

答。 是的,在这种情况下,我们可以毫无问题地使用 hashmap,因为 hashmap 不会减少您可以存储的值。 您可以在任何哈希图中存储任意数量的空值。

Q5。 Java中的hashmap实现如何处理冲突?

答。 java.util.HashMap 的代码库使用链接的方法来处理冲突。 这种链接的工作方式是将包含键和值对的哈希映射的任何新条目存储在一个链接列表中,然后该列表将存储在哈希映射的现有数据所在的位置(存储桶位置) .

如果您在哈希图中拥有的所有键都具有相同的哈希码,那么您的哈希图将不再是哈希图。 它将变成一个链表。 查找时间将增加一阶 (o(1)),即恒定时间,到阶 N (O(N)),即线性时间。

Q6。 您能否在 java 的 hashmap 实现中存储具有空值的键?

答。 是的,在 java 的 hashmap 实现中,您将能够存储具有空值的键。 但是您只能存储一个这样的密钥,该密钥将始终存储在存储桶列表的开头。 hashmap 不会在这里调用函数 hashcode() ,因为如果该函数用于空键,它将抛出空指针异常错误。 如果您希望将哈希图的第一个索引返回给您,则必须使用 get 函数而不是使用 null 值作为键。

阅读:数据结构中的排序:类别和类型

问题 7。 您认为 hashmap 旨在模仿哪种数据结构?

答。 哈希图应该模仿哈希表数据结构的外观和功能。 如果您想以键值对的形式存储值,哈希表数据结构是您的理想选择。 首选此哈希表的主要原因是查找时间。 因此,如果您有要搜索的密钥,那么只需按一个或恒定时间的顺序,您就可以取回您想要的值。

Q8。 由于 hashmap 不是结构或数组等核心数据结构之一。 每当您创建哈希图时,您认为幕后发生了什么? 您认为哪种数据结构的组合为我们提供了哈希图?

答。 尽管 hashmap 实际上代表了一个 hashtable,但在底层,它并不是直接实现的。 我们使用两个众所周知的数据结构来为 hashmap 注入活力。 我们使用链表和数组。 链表用于动态存储键值对,数组用于将所有这些链表存储到其中; 它们一起形成一个哈希图。

从 Java 8 开始,如果链表变得足够大,那么 Java 会代替链表实现二叉搜索树。 进行此更改是为了节省时间并提高 hashmap 的整体性能。

另请阅读:数据科学面试问题

问题 9。 如果我们想在同一个键下存储多个值,你认为在 Java 中的 hashmap 实现中是否可行?

答。 不,您将无法在哈希图中存储重复的键。 如果您尝试将新值存储在已存在于 hashmap 中的键中,则 hashmap 将简单地删除先前存储在该键中的值并将其替换为新值。

在这种情况下,hashmap 的大小不会改变,这意味着不会在 hashmap 中添加键。 这个特性是我们使用函数 keyset() 来取回 hashmap 的所有键并且这个函数返回一个集合而不是集合的原因之一(因为在一个集合中所有值都必须是唯一的)。

问题 10。 你能在 HashMap 中存储重复值吗?

答。 是的,您将能够在哈希图中存储重复值。 这就是您从哈希图中检索所有值的原因。 然后我们得到一个集合,而不是一个集合。 它没有以列表的形式给出值,因为不能保证排序。

问题 11。 在 Java 的 hashmap 实现中,它是线程安全的吗?

答。 不,普通的 Hashmap 在 Java 中根本不是线程安全的。 理想情况下,您应该避免将哈希图共享给可以更改值并以任何形式或形状编辑哈希图的线程。 但是,您可以使用只读哈希图,然后将其输入线程。 这样,其中包含的值不会改变。

问题 12。 如果我们在使用多线程的应用程序中使用 hashmap,您认为会发生什么?

答。 如果您碰巧将 hashmap 传递给使用多个线程的应用程序,并且这些线程中的每一个都可以修改、添加或删除存储在 hashmap 中的值,那么构建 hashmap 的内部数据将被破坏. 用来形成hashmap的链接会丢失,hashmap就会失去结构,也就失去了它的用途。 因此,如果要在线程化的应用程序中使用它们,始终建议您始终使用线程安全的 hashmap。

问题 13。 如果我们想在 Java 中遍历整个 HashMap。 我们可以通过哪些不同的方式来做到这一点?

答。 有很多方法可以在 java 中迭代 hashmap; 下面列出了其中一些:

  1. 您可以将函数 keySet 与迭代变量结合使用。
  2. 您可以将函数 enterySet 与迭代变量结合使用。
  3. 您可以使用函数 entrySet 并将其与增强的循环一起使用。
  4. 您可以使用 keySet 并获取方法。

另请阅读: Python 中的数据结构和算法:您需要知道的一切

接下来是什么?

如果您想了解数据科学,请查看 IIIT-B 和 upGrad 的数据科学执行 PG 计划,该计划是为在职专业人士创建的,提供 10 多个案例研究和项目、实用的实践研讨会、行业专家的指导、1与行业导师一对一,400 多个小时的学习和顶级公司的工作协助。

Hashtable 与 HashMap 有何不同?

非同步数据结构是 HashMap。 另一方面,Hashtable 是线程安全的,可以在多个线程之间共享,而无需同步代码。 Hashtable 不允许一个空键或多个空值,但 HashMap 允许。 在非线程应用程序中应该使用 HashMap 代替 Hashtable。 简单来说,HashMap 应该用在单线程或者非同步的应用中。

使用 HashMap 还是 TreeMap 更快?

在 TreeMap 中,值由键确定。 它不能有一个空键,但它可以有多个空值。 它与 HashMap 相同,除了不是升序,它保留升序(使用其键的自然顺序排序)。 HashMap 采用基于数组的数据结构来根据散列函数组织其组件,作为基于散列表的实现。 对于 add()、delete() 和 contains 等大多数操作,HashMap 预测 O(1) () 的恒定时间性能。 因此,它比 TreeMap 快得多。

什么时候使用 HashMap 而不是 ArrayList 更好?

只有当我们希望存储的数据具有唯一键时,HashMap 才有意义。 当基于密钥查找事物时,我们应该使用它,因为快速访问时间是必须的。 当保持集合中条目的相同顺序至关重要时,我们应该避免使用 HashMap。 它们彼此不同,并且服务于不同的目的。 如果要在 Java 中存储对象,请使用 HashMap 将键映射到值,否则使用 ArrayList。