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

Java HashMap的获取/输入复杂度

宰父正真
2023-03-14
问题内容

我们习惯说HashMap get/put运算是O(1)。但是,这取决于哈希实现。默认对象哈希实际上是JVM堆中的内部地址。我们确定声称get/put O(1)是否足够好?

可用内存是另一个问题。据我从javadocs理解,HashMap load factor应该是0.75。如果我们在JVM中没有足够的内存并且load factor超出限制怎么办?

因此,似乎无法保证O(1)。是有意义还是我想念什么?


问题答案:

这取决于很多事情。这通常是 O(1),一个体面的哈希它本身是固定的时间…但你可以有一个哈希这需要很长的时间来计算,而如果在散列图多个项目,其中返回相同的散列码,get将不得不遍历他们,呼吁他们equals每个人寻找比赛。

在最坏的情况下,HashMap由于遍历同一哈希桶中的所有条目(例如,如果它们都具有相同的哈希码),则a 具有O(n)查找。幸运的是,根据我的经验,最坏的情况在现实生活中不会经常出现。因此,不能肯定,不能保证O(1),但是通常这是你在考虑使用哪种算法和数据结构时应该假定的。

在JDK 8中,HashMap已经进行了调整,以便可以比较键的排序方式,然后将任何人口稠密的存储桶都实现为树,因此即使有很多具有相同哈希码的条目,复杂度也为O(log n)。当然,如果你的键类型的相等性和顺序不同,则可能会导致问题。

是的,如果你没有足够的内存来存储哈希映射,那么你将遇到麻烦…但是,无论使用哪种数据结构,这都是正确的。



 类似资料:
  • 我有一个.jrxml文件,我想将代码中的一些参数传递给它。我有一个<code>Orde</code>r类,它具有<code>双倍价格</code<、<code>int quantity</code〕和<code>Product Product</code’等字段。情况很简单,当我需要传递价格或数量时,我只需要这样做: 当我尝试传递 时出现问题。我尝试了类似的东西: 还有许多其他的,但我一直得到错误

  • 目前为止,我们写的程序都是可预见的,它们每次运行时都做相同的事情。然而大多数时候我们需要程序能从用户那得到输入并随之做出反应。 有很多种方式可以得到输入,包括键盘输入,鼠标移动和按钮点击,此外还有更特别的机制,例如声控和视网膜扫描。本文我们只考虑键盘输入。 在头文件iostream.h中,C++定义了一个cin对象来处理输入,就像用cout对象处理输出一样。从用户那得到一个整型值可以这么写: in

  • 我想把一些JSON解析成一个SQL的INSERT,但是,由于不同级别的数据片段不同,很难得到所有的数据。 以下是JSON文件: 到目前为止,这就是我所用的Python,它可以工作: 结果是: 这有点对,但我需要插入看起来像: 我看到了一些例子:例1 但我一直没能让它为我工作。 @斯科尔05 我想你的意思是:但它导致了一个错误:AttributeError:'dict'对象没有属性'iteritem

  • 问题内容: 我需要使用JSlider实时获取输入,这意味着它将在不按任何按钮的情况下返回输入。我有滑块的这段代码: 甚至有可能这样做吗?我以为可以使用actionListener,但是没有成功。 问题答案: 例如,可以使用ChangeListener

  • 问题内容: 我正在尝试获取Disabled()字段的值,但是它返回一个空字符串。 我已经尝试过:,但是到目前为止,这些方法都无效。 问题答案: 如果您标记的是这样- 您的代码应为- 要么 确保您的代码正确。如果这不起作用,请发布您正在使用的HTML代码。 对于此标签- 要获取value属性- 值必须是 让我知道是否有任何问题。 如果这样做不起作用,则可能必须使用javascript执行程序- 您的

  • 问题内容: 如何获取输入中文本插入符号的索引? 问题答案: -> 选择开始