当前位置: 首页 > 面试题库 >

字符串作为哈希图中的键

吉栋
2023-03-14
问题内容

在过去的一个小时中,我已经阅读了很多文章,但是对于在Hashmap中使用不可变对象作为键的概念,我仍然不太清楚。我有一个哈希图,其键为字符串。哈希图中的值是MyStore,其中MyStore表示有关我拥有的商店的信息。字符串代表地址。在我的代码中,我拥有的逻辑是,我首先在映射中查找该键(如果存在)->获取其值,如果不存在,则将其放入哈希映射。我的经理刚刚告诉我,密钥会在将来发生变化,也就是说,我的商店地址会在将来发生变化。他说,在这种情况下,我首先检查密钥是否存在的逻辑将不起作用。我不明白他在这里的意思。我想非常清楚地理解以下几点-

  1. 哈希映射的可变键和不可变键之间的区别。
  2. 如果您使用可以更改的不可变密钥,会发生什么?-我知道这没有道理,但我想清楚地了解经理在这里所说的话。
  3. 一些帖子谈论字符串,如果用作哈希表中的键缓存其哈希码-这是什么意思?
  4. 如果说我使用可变对象作为实现哈希码并等于的哈希表中的键,那么它将起作用吗?我假设这样做是因为,如果密钥发生更改,则contains方法将查看是否存在密钥。如果不存在,它将 放入 该条目,以便您将来可以 获取

我的意思不是要创建一个重复的帖子,如果以前已经讨论过的话。如果我错过阅读所有问题答案的帖子,请给我指出。如果没有,请以通俗易懂的方式向我解释以上问题,以便将来对其他读者有用:)。随时编辑我的帖子的主题,这样以后如果有人有类似问题,他们可以直接登陆:)


问题答案:

首先:HashMap如何工作?

基本上,它具有一个数组,当您在映射中放置键值对时,它存储在数组中的某个位置。根据将键hashCode()传递给哈希方法的结果来选择数组中的位置。这是为什么?好吧,如果您请求某个键的值,则可以简单地重新计算数组中用于查找键的索引及其关联的值,以再次找到数组中的索引。(需要更多的逻辑来处理映射到相同索引的键,但是我只是想让您了解基本机制)然后equals()用于验证计算索引处的键是否确实是请求的键。

  1. 由此可以更清楚地看出为什么不变键比可变键更好。不可变的键将始终保持相同的hashCode()值,并且哈希函数将再次找到正确的存储桶(= hashMap的数组中的索引)。

这并不意味着可变键无法工作。如果键上的突变不影响哈希码,或者只要使用hashMap,键就不会发生突变,那么可变键就可以工作。

  1. 不变密钥如何更改?好吧,键本身可能无法更改,但是键值映射可以在业务逻辑中更改。如果使用地址作为键来创建地图,那么您将依赖商店地址不会更改的事实。如果商店的地址发生变化,您将不会以其新地址作为关键字在地图上找到它。您的经理有一个有效的观点。

  2. 在Map中查找键的速度很大程度上取决于计算hashCode的速度。对于字符串,此计算将遍历字符串中的所有字符。如果将长字符串用作键并具有大量的Map访问权限,则可能会导致性能瓶颈。因此,Java的String实现会缓存哈希值,因此它将仅计算一次。但是,只有String再次使用同一实例时,您才避免计算哈希码(新实例将不具有缓存的值)。您可以intern()使用所使用的密钥,但是只有在可以证明确实存在性能瓶颈的情况下,才考虑使用此密钥,因为String实习确实会带来自己的开销。

  3. 如1中所述:如果可变键的哈希码不受突变影响,则可变键可以工作。例如,使用Customer作为键(hashCode()仅基于客户名称),然后仅允许名称不更改而允许其他值更改的Customer实现是可靠的键。



 类似资料:
  • 问题内容: 我有一个要哈希的字符串。在node.js中生成哈希的最简单方法是什么? 哈希用于版本控制,而非安全性。 问题答案: 看看crypto.createHash(algorithm)

  • 问题内容: 您如何将任意字符串转换为唯一的整数,这在Python会话和平台之间是相同的?例如,由于每个Python会话和平台均返回不同的值,因此无法使用。 问题答案: 如果哈希函数确实不适合您,则可以将字符串转换为数字。 通过将每个三元组映射到,这是可逆的。

  • 说到什么是字符串哈希(Hash)?很多人都会疑惑,我们可以这么理解,定义一个把字符串映射到整数的函数 f,这个 f 称为是Hash函数。而我们希望这个函数 f 可以方便地帮我们判断两个字符串是否相等。 (1)Hash 的思想 Hash 的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。 (2)使用场景 当一个字符串规模很大,并且需要多次访问该字符串或者子串的时候,我们可以用哈希函数对每

  • 问题内容: 我是Java编程的新手。我创建了一个包含我的键值对的哈希映射,可用于将用户输入替换为对应于各个键的值。 即 我在公式评估中使用它 注意 :为用户提供了特定公式的特定输入方式(值1 +值2 +值3) 我正在使用(value1 value2 value3)并将其转换为(value1key value2key value3key) 更新: 我现在更好地理解该问题旨在帮助更好地了解如何利用哈希

  • 问题内容: 我有一个Java应用程序,我想在其中生成字符串的id(以便将这些字符串存储在neo4j中)。为了避免数据重复,我想为存储在整数中的每个字符串生成一个ID,该ID对于每个字符串都应该是唯一的。我怎样才能做到这一点 ? 问题答案: 有64位。长度为9的A 有72位。从鸽子洞的原理 -您不能得到9个字符长的字符串到的唯一哈希。 如果你仍然想一个哈希:你可以只取两个标准的哈希函数[不同!] ,

  • 问题内容: 我所说的“非空”是指至少包含一个非零字符的字符串。 供参考,这里是实现: 并且算法在文档中指定。 在整数溢出发生之前,答案很简单:不是。但是我想知道的是,由于整数溢出,非空字符串的哈希码是否可能为零?你能建造一个吗? 理想情况下,我正在寻找的是数学演示(或指向其中的链接)或构造算法。 问题答案: 当然。例如,字符串 f5a5a608 的哈希码为零。 我通过简单的蛮力搜索发现: 编辑: