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

HashMap中的Double

闾丘正志
2023-03-14
问题内容

我当时想将Double用作HashMap的键,但是我知道浮点比较并不安全,这让我开始思考。Double类上的equals方法是否还不安全?如果是,那将意味着hashCode方法也可能不正确。这意味着使用Double作为HashMap的键将导致不可预测的行为。

有人可以在这里确认我的任何猜测吗?


问题答案:

简短答案: 请勿这样做

长答案: 这是密钥的计算方式:

实际的键将是一个java.lang.Double对象,因为键必须是对象。这是它的hashCode()html" target="_blank">方法:

public int hashCode() {
  long bits = doubleToLongBits(value);
  return (int)(bits ^ (bits >>> 32));
}

doubleToLongBits()方法基本上占用8个字节,并表示它们的长度。因此,这意味着double的计算中的微小变化可能意味着很多,您将有很多关键失误。

如果您可以在点后找到给定数量的点,请乘以10 ^(点后的位数),然后转换为int(例如,对于2位数乘以100)。

这样会更安全。



 类似资料:
  • 我在Java有一个源HashMap: 存储各种长度的关键字。我想遍历这个HashMap并计算出存储在映射的字符串部分中的ngram的长度,该字符串部分定义了每个关键字的文本。 使用这些数据,我想填充一个HashMaps的目标ArrayList: 结果是,ArrayList的索引对应于给定关键字的ngram大小减去1,即keywordNGrams(0)将接收unigrams,keywordNGram

  • 我有一个名为的模型是用JSON编写的。在另一个类中,我将此模型设置为HashMap的键。 现在我有了一个方法,我需要检查值是否为false,返回模型(这是HashMap的关键)。这是代码,但它返回NULL。

  • 问题内容: 谁能详细解释这种方法,谢谢。 问题答案: 设计通用哈希码的问题之一是,您将所有这些工作都放在了确保良好的位扩展上,然后有人来使用并以完全撤消的方式使用它。 让我们以一个带有X和Y(均为整数)的坐标类的经典示例为例。 这是一个经典的示例,因为人们会用它来证明这不是一个很好的哈希码,因为通常会有多个对象,其中(所有哈希都为0)或X和Y为Y和X的对象其他(将散列相同)和其他情况下,我们最终得

  • 根据Java8中的这个链接,为了避免在map()中的冲突,使用平衡树来实现,而不是。 那么,如果: > (和其他映射()都是使用自平衡树实现的,因为最坏情况下的可访问性是相同的 我可以实现如下: 除了排序和可访问性,的其他属性是什么?

  • 我希望下面的代码中有,但它运行良好。 根据JavaDoc for: 这个类的所有“Collection view Methods”返回的迭代器都是快速失败的:如果在迭代器创建后的任何时候,以任何方式(除了通过迭代器自己的remove方法)修改了映射,则迭代器将抛出一个ConcurrentModificationException。 因此,由于我在获得之后修改了,所以我应该得到。为什么不扔?

  • 我刚刚在阅读java中HashMap和HashTable类之间的区别。我发现了一个区别,前者允许空键,而后者不允许相同的权限。就HashMap的工作而言,我知道,它在key上调用hashcode方法来查找要放置该键值对的存储桶。我的问题来了:空值的hashcode是如何计算的,或者空值的hashcode是否有默认值(如果有,请指定值)?