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

HashMap存储桶中的IdentityHashCode

姚阳德
2023-03-14
问题内容

在的实现细节中HashMap,我可以阅读:

When using comparators on insertion, to keep a
 * total ordering (or as close as is required here) across
 * rebalancings, we compare classes and identityHashCodes as
 * tie-breakers.

如果我有恒常的能力hashCodeequals而我的班级没有实现Comparable,它将如何打破束缚以及如何构造树呢?

我的意思是-
铲斗会变成一棵树,并会System.identityHashCode打断领带。然后,我将尝试containsKey使用其他实例(具有hashCodea.equals(b) == true)相同的实例来调用方法,它将具有不同的实例,identityHashCode因此是否有可能树被错误的节点遍历(向左而不是向右)并且找不到键?

我是否缺少某些东西,或者这是正常现象?


问题答案:

存储桶将identityHashCode在插入期间使用,但查找仅使用哈希码和compare()调用(如果可用)。这意味着有时需要扫描节点的两个子树。

查找逻辑看起来像这样

do {
  if (... keys are equal or can be compared ...) {
    // Go left, right or return the current node
    ...
  } else if ((q = pr.find(h, k, kc)) != null)
    // Search the right subtree recursively
    return q;
  else
   // Go to the left subtree
   p = pl;
} while (p != null);

请参阅http://hg.openjdk.java.net/jdk10/jdk10/jdk/file/ffa11326afd5/src/java.base/share/classes/java/util/HashMap.java#l1901并注意tieBreakOrder()(该方法负责比较identityHashCodes不会在中的任何地方调用find()



 类似资料:
  • 存储桶用于存储用户的任意文件。 对象存储是用于存储任意文件的分布式存储服务。存储桶即bucket,用于存储对象文件。用户在存储文件之前必须先创建存储桶,云管平台以存储桶为对象存储的资源单位分配给项目使用。用户可以通过网络便捷的在对象存储中上传、下载以及分享文件。 云管平台目前支持对接并导入基于S3协议的对象存储服务MinIO、Ceph Radio以及公有云提供的对象存储服务。 使用流程: (二者任

  • 我正在尝试使用put方法将arraylist存储在hashmap中。我在下一步中清除了列表,以便在下一次迭代中添加下一组值。一旦清除列表,地图中的值也会被清除。虽然我在清理清单之前已经把清单放在地图上了。 sysout打印{key=[]} 有人请让我清楚如何坚持hashmaphash地图。

  • 问题内容: 我了解在HashMap中,条目(键,值)基于hash(Key.hashCode)->表示存储桶位置的索引放置在存储桶中。如果某个条目已经放置在该位置,则会创建一个链表,并将新条目(如果它具有不同的键->通过equals()方法)放置在链表的开头。 我可以将此概念与ConcurrentHashMap的概念进行关联,但不是存储桶,而是各个线程具有锁的段。而不是条目,有HashEntry(i

  • 我发现,当我在IAM策略中使用NotResource作为掩码并将其附加到bucket时,受策略影响的资源是那个bucket中没有在NotResource子句中指定的所有资源。我需要指出一个文档,它清楚地表明情况是这样的。我一直在查看内联策略的文档,以及s3访问管理和策略的文档,但我很难找到这些特定的信息。文档中是否说明了在内联策略中指定资源的限制?

  • 更新:在联系了Firebase的支持后,他们告诉我,在修复了他们的后端之后,这个问题确实被修复了。

  • 在谷歌云存储中,我在名为图像的根桶中有一个名为猫的桶。我正在使用google-api-ruby-Client gem上传文件。我可以将文件上传到根桶“图像”,但上传到“图像/猫”不起作用。我知道谷歌云存储中的存储桶没有斜杠的概念,所以我无法弄清楚如何指定嵌套存储桶的名称。 这给出了nil:NilClass的错误