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

为什么Java的hashCode不支持通用哈希?

壤驷文华
2023-03-14
问题内容

某些哈希表方案(例如布谷鸟哈希或动态完美哈希)依赖于通用哈希函数的存在以及能够收集表现出冲突的数据并通过从通用哈希函数系列中选择一个新的哈希函数来解决这些冲突的能力。

不久前,我试图在以杜鹃哈希为后盾的Java中实现哈希表,并遇到了麻烦,因为尽管所有Java对象都有一个hashCode函数,但hashCode返回的值对于每个对象都是固定的(当然,除非对象更改)。这意味着如果没有用户提供外部家族的通用哈希函数,就不可能构建依赖于通用哈希的哈希表。

最初,我以为可以通过直接将通用哈希函数应用于对象的hashCodes
来解决此问题,但这不起作用,因为如果两个对象具有相同的hashCode,那么您将应用于这些哈希代码的 任何 确定性函数,甚至是随机的-
选择的哈希函数,将导致相同的值,从而导致冲突。

看来这将不利于Java的设计。这意味着HashMap完全禁止其他哈希容器使用基于通用哈希的表,即使语言设计人员可能认为这样的表在语言设计中是适当的。这也使第三方库设计人员更难建立这种哈希表。

我的问题是: Java是否选择了hashCode不考虑使用多个哈希函数对对象进行哈希处理的可能性的原因?
我知道许多好的哈希方案(例如链式哈希或二次探查)都不需要它,但是似乎该决定使在Java对象上使用某些类的算法变得困难。


问题答案:

简单性
。Java允许类设计者提供自己的hashCode,正如您所提到的,对于“普通”哈希表已经足够了,并且很难理解。

此外,在设计Java Collections API时,在标准库中具有通用哈希表已经足够大胆了。C从来没有他们。C
让他们在STL为 hash_sethash_map,但这些并没有使之成为标准。只是现在,在C 0x中,再次考虑将哈希表标准化。



 类似资料:
  • 本文向大家介绍为什么Java不支持<<相关面试题,主要包含被问及为什么Java不支持<<时的应答技巧和注意事项,需要的朋友参考一下 Java添加了运算符“ >>>”来执行逻辑右移,但是由于 逻辑和算术左移运算是相同的 ,因此Java中没有“ <<<”运算符。 来自Java的Shifts …

  • 问题内容: Java为什么不包括对无符号整数的支持? 在我看来,这是一个奇怪的遗漏,因为它们允许人们编写不太可能在意外大的输入上产生溢出的代码。 此外,使用无符号整数可以是一种自我证明的形式,因为它们指示无符号int打算保留的值永远不会为负。 最后,在某些情况下,无符号整数对于某些操作(例如除法)可能更有效。 包括这些的不利之处是什么? 问题答案: 在两行之间阅读时,我认为逻辑是这样的: 通常,J

  • 问题内容: 我已经阅读了每个原始数据类型和对象引用通过值传递的地方吗? 我曾尝试在Google中搜索为什么Java不支持按引用传递,但 我只得到Java不支持按引用传递, 而且 我找不到背后的任何原因 。 为什么不能通过引用传递原始数据类型? 编辑: 假定它是主观和争论的,大多数人都关闭了我的问题。 好吧,不是,它有一个明确的答案,我的问题就像你为什么不能创建抽象类的对象,并且它也不是重复的,因为

  • 我注意到一件奇怪的事情,显然Firefox说它支持HTTPS上的Brotli,但不支持HTTP?Brotli与gzip类似,但效率更高,为什么它会将其限制为HTTPS?在HTTPS选项卡上,我看到: 他被派去了。但在另一个网站上,我没有看到。为什么它不能做Brotli压缩HTTP?

  • 本文向大家介绍为什么jsonp不支持post的方法?相关面试题,主要包含被问及为什么jsonp不支持post的方法?时的应答技巧和注意事项,需要的朋友参考一下 jsonp是跨域解决方案的其中一种方式,依赖script来突破同源策略的限制,而script是通过get方式拉取资源的。 可参考我的文章中的jsonp的实现

  • 我有一个带有tabbarcontroller的应用程序,两个带有它的controller,现在在一个controller中我以肖像模型显示了uiactionsheet: UIActionSheet*ActionSheet=[[UIActionSheet alloc]InitWithTitle:@""Delegate:nil CancelButtonTitle:@"Cancel"Destructiv