为什么linkedhashmap维护双向链表进行迭代

2024-06-25

因为任何线程都没有内部合理的解释。 请给我确切的理由。

  1. 对于插入顺序,用单链表维护就足够了,但为什么不呢?

  2. 在这种情况下,双向链表如何提高性能?

  3. 所有方法都是从 hashmap xpt 4 方法继承的,那么 hashmap 的迭代器不维护顺序,而 linkedhashmap 维护顺序?


你是对的,你只需要维护一个单链表来跟踪插入顺序。但为了有效地维护单链表,实际上需要一个双向链表。

按顺序考虑三个条目

A ---> B ---> C

假设您删除B。明显地A现在应该指向C。但除非你之前知道该条目B您无法有效地说出现在应该指向哪个条目C。要解决此问题,您需要条目指向两个方向。

  --->   ---> 
A      B      C
  <---   <---

这样,当您删除B你可以只看之前和之后的条目B (A and C)并更新,以便A and C互相指指点点。

原因LinkedHashMap保持插入顺序,同时HashMap尽管事实上除了 4 个方法之外的所有方法都是继承的,但它的编写非常巧妙。大多数特定于实现的操作都是以下成员HashMap.Entry, not HashMap. LinkedHashMap has a private static class LinkedHashMap.Entry这扩展了static class HashMap.Entry of HashMap。你打电话时put or remove,例如,代码为LinkedHashMap可以与以下代码相同HashMap因为它是条目本身跟踪之前和之后的信息。作为示例,以下是完整代码LinkedHashMap.Entry.remove()我在上面解释过

private void remove() {
    before.after = after;
    after.before = before;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么linkedhashmap维护双向链表进行迭代 的相关文章

随机推荐