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

The Java LinkedHashSet uses a doubly-linked list. Can it also be iterated backwards?

Oracle 文档对 LinkedHashSet 的描述如下:"Hash table and linked list implementation of the Set interface, with predictable iteration order. This implementation differs from HashSet in that it maintains a doubly-linked list running through all of its entries."

您可以获得的迭代器是按插入顺序排列的。反向插入顺序的迭代在技术上也是可行的想法,因为它是 doubly-linked。

是否可以创建这样的反向迭代器(或者甚至是同时执行这两种操作的 ListIterator)?

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暗中支持向后迭代

的实现

散列 table 查找为您提供指向列表中某处条目的指针。要删除它,您需要引用先前的列表条目。这就是LinkedHashMap需要使用双向链表的原因。