当前位置: 首页 > 知识库问答 >
问题:

Java哈希映射机制

劳和雅
2023-03-14

>

  • 阅读算法书,需要掌握哈希表的概念。他们写了关于使用单独链接的散列和使用线性探测的散列。我猜Java的HashMap是一个哈希表,因此我想知道HashMaps使用什么机制(链接或探测)?

    我需要实现最简单的HashMap与get,put,删除。你能给我指出好的材料来阅读吗?

    当用于映射的惟一键是自定义对象时,我们需要在相应的类型中实现hashCode()函数。我做得对吗?或者什么时候需要hashCode()。

    不幸的是,这本书没有回答所有的问题,尽管我知道对你们中的许多人来说,这些问题是低级的。

  • 共有3个答案

    农飞尘
    2023-03-14

    HashMap的工作原理是散列。它的工作有两个方面。

    首先,它维护一个链接列表来存储具有相似值的对象,这意味着“相等”的对象

    其次,它有一个这些链表的集合,其标题存在于数组中。

    更多信息请参考博客Java集合内部工作

    拓拔谭三
    2023-03-14

    这是我们许多人在采访中最困惑的问题。但它并没有那么复杂。


    我们知道

    >

  • HashMap将键值对存储在Map.Entry中(我们都知道)

    HashMap使用哈希算法,并在put()和get()方法中使用hashCode()和equals()方法。(连我们都知道这一点)

    当我们通过传递键值对来调用 put 方法时,HashMap 使用 Key **hashCode()** 和散列来 **找出索引** 来存储键值对。(这很重要)

    Entry**存储在LinkedList**中,因此如果已经存在条目,则使用**equals()方法检查传递的密钥是否已经存在**(即使这很重要)

    如果是,它会覆盖该值,否则它会创建一个新条目并存储该键值条目。

    当我们通过传递Key调用get方法时,它再次使用hashCode()在数组中查找索引,然后使用equals()方法查找正确的Entry并返回它的值。(现在这很明显)

    此图像将帮助您了解:

  • 邓赤岩
    2023-03-14

    1:在java 1.8之前,HashMap使用单独的链接和链接列表来解决冲突。每个存储桶都有一个链接列表。

    2: 嗯,也许是这个?

    3:是的,你是对的,< code>hashCode()是用来计算密钥的哈希的。那么散列码将被转换成0和桶数- 1之间的数。

     类似资料:
    • 本文向大家介绍Java中并发哈希映射和同步哈希映射之间的区别,包括了Java中并发哈希映射和同步哈希映射之间的区别的使用技巧和注意事项,需要的朋友参考一下 并发Hashmap是jdk1.5中引入的类。并发哈希映射仅在添加或更新映射时在称为片段的存储桶级别应用锁。因此,并发哈希映射允许对映射进行并发读写操作。  同步hashmap(Collection.syncronizedHashMap())是C

    • 我正试图让我的头脑围绕着一个哈姆特的细节。我会用Java自己实现一个,只是为了理解。我熟悉尝试,我想我得到了HAMT的主要概念。 基本上, 两种类型的节点: null null 我不太明白的部分是碰撞检测和缓解。在链接的论文中,他暗示了这一点: 然后将现有键插入到新的子哈希表中,并添加新键。每使用5个以上的散列比特,冲突的概率就减少1/32倍。偶尔,可能会消耗整个32位哈希,必须计算一个新的哈希来

    • 我有4节课。其中一个保存有关客户的信息。另一个是关于订单的。另外两个类扮演注册表角色,一个是客户注册表,另一个是订单注册表。 Orders registry有一个哈希映射,如下所示: 客户注册也是如此。 类orders具有int orderid。类客户具有int customerid。我通过两个注册中心添加了演示数据(假设一个客户的客户ID为100,一个订单的订单ID为500)。 我编写了一些简单

    • 问题内容: 我有需要检查的情况。我有一个名为: 因为该键本身不存在,所以抛出。如果我检查 由于引发了另一个。如何测试地图中的键不存在?我知道该方法应该处理它,但这不在我的控制之下。] 问题答案: 即使现在我也因为.get引发异常而得到nullpoiner 如果只有一行,并且确定它抛出异常,则唯一的可能性可能是null。

    • 问题内容: Freemarker有两个集合数据类型,即列表和哈希图。有没有一种方法可以像对列表一样遍历哈希图键? 因此,如果我有一个带有数据的变量,则可以说: 我想用其值打印所有用户的属性。这是无效的,但目标很明确: 问题答案: 编辑: 不要在FreeMarker 2.3.25及更高版本中使用此解决方案,尤其是不要使用。查看其他答案。 您使用内置的按键功能,例如,这应该可以工作:

    • 问题内容: 使用hashmap而不是使用对象类好吗……使用Hashmap…。 并使用对象类..... 请在应用程序运行状况,内存要求等方面告诉我… 问题答案: 这在很大程度上取决于您要实现的目标:为了提高灵活性,哈希映射会更好。但是灵活性是有代价的:哈希映射比具有相同数量的强类型字段的类还要大和慢。 哈希映射比具有相同数量字段的类具有更大的内存占用量 哈希图会强制对基元进行装箱 哈希图的创建和访问