LinkedHashMap的迭代顺序

10

在阅读了 LinkedHashMap 的文档(并且多次使用)之后,我仍然不清楚其中一个属性的含义...即 LinkedHashMap 的迭代顺序是否为:

  1. entrySet()keySet()values() 的插入顺序相同,还是
  2. entrySet()keySet() 的插入顺序相同,但 values() 的顺序不同,还是
  3. 只有 entrySet() 的插入顺序相同?

我想象第三种情况不太可能,但我想知道是否有人知道 (1) 或 (2) 是正确的,因为对 values() 进行迭代可能是一个罕见的用例。


1
在查看源代码后,我意识到所有三个迭代器都遵循插入顺序。 - Andrew Mao
只是尝试一个例子怎么样? - MrSmith42
7
依靠轶事证据进行的证明对我来说并不可信...最终我查阅了源代码。谢谢! - Andrew Mao
@MrSmith42:这是一种尝试示例可能很难得出有价值结论的问题类型。你可能会轻易地得到一个错误的结果——插入顺序在某个示例中保持不变,但在更复杂或长时间运行的示例中则不会。 - LarsH
1
检查源代码也不会好多少。 :-) - LarsH
1个回答

4

LinkedHashMap保留插入顺序;因此,第一个选择是好的。

Map是一组Map.Entry对象,选项2和3会相当奇怪 ;)


Map.Entry对象的集合很有意义,尽管我从未意识到它是这样的。例如,我以为双向链表只能通过键来遍历。现在看起来显而易见了,因为我已经查看了源代码。 - Andrew Mao
好的,.entrySet() 返回一个Set<Map.Entry<K, V>>。如果您插入k1、v1,然后再插入k2、v2,但在读取k1时要读取v2,那将是相当悲哀的:p - fge
此外,你不可能在不通过 entrySet()keySet()values() 的情况下迭代 LinkedHashMap -- 它本身并没有“插入顺序”。 - Louis Wasserman
抱歉,我的意思是“迭代顺序”。 - Louis Wasserman
澄清一下,keySet()values()集合**是按照插入顺序迭代的。 - Jeremy Fishman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接