Java LinkedHashSet使用双向链接列表。也可以向后迭代吗?

问题描述 投票:1回答:2

Oracle文档对LinkedHashSet进行了以下说明:“ Set接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护贯穿其所有条目的双链表。”] >

您可以获得的迭代器按插入顺序。在反向插入顺序中进行迭代也是技术上可行的想法,因为它是一个[双]链接。

是否可以创建这样的反向迭代器(或什至同时创建这两个ListIterator?)>

Oracle文档对LinkedHashSet进行以下说明:“ Set接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与...中的HashSet不同]]

LinkedHashSet不会公开任何API来向后迭代。尽管这会严重影响性能,但是您可以将LinkedHashSet复制到List(保留其顺序),然​​后向后迭代:

LinkedHashSet<SomeClass> myLinkedHashSet = ...; List<SomeClass> myList = new ArrayList<>(myLinkedHashSet); // Order is retained ListIterator<SomeClass> myIter = myList.listIterator(myList.size()); while (myIter.hasPrevious()) { System.out.println(myIter.previous()); }

LinkedHashMap迭代器仅支持向前。您可以在OpenJDK in the github mirror中阅读其实现。这不像私下实现ListIterator并暗中支持向后迭代的实现。

哈希表查找为您提供了指向列表中某个位置的条目的指针。要删除它,您需要引用上一个列表条目。这就是为什么LinkedHashMap需要使用双向链表的原因。

java collections linked-list iteration hashset
2个回答
0
投票
LinkedHashSet不会公开任何API来向后迭代。尽管这会严重影响性能,但是您可以将LinkedHashSet复制到List(保留其顺序),然​​后向后迭代:

LinkedHashSet<SomeClass> myLinkedHashSet = ...; List<SomeClass> myList = new ArrayList<>(myLinkedHashSet); // Order is retained ListIterator<SomeClass> myIter = myList.listIterator(myList.size()); while (myIter.hasPrevious()) { System.out.println(myIter.previous()); }


0
投票
LinkedHashMap迭代器仅支持向前。您可以在OpenJDK in the github mirror中阅读其实现。这不像私下实现ListIterator并暗中支持向后迭代的实现。

哈希表查找为您提供了指向列表中某个位置的条目的指针。要删除它,您需要引用上一个列表条目。这就是为什么LinkedHashMap需要使用双向链表的原因。

© www.soinside.com 2019 - 2024. All rights reserved.