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需要使用双向链表的原因。