哪些 Java 数据结构具有确定性的迭代顺序?

use*_*385 4 java collections

在一次采访中,我被问到以下问题:

您的应用程序需要存储对象,以便在迭代结构时返回的条目的顺序是确定的。换句话说,如果对同一结构进行两次迭代,则两次迭代中返回的元素的顺序将相同。您会使用以下哪个类?

假设结构没有发生突变。(勾选任何适用的项)

HashMap 
LinkedHashSet   
HashTable   
LinkedHashMap
TreeSet 
TreeMap 
Run Code Online (Sandbox Code Playgroud)

我建议使用 LinkedHashSet。这是正确答案吗?为什么或者为什么不?

Mur*_*nik 5

确定性顺序仅意味着它是不断可再现的 - 相同的输入将始终提供相同的迭代顺序。在这种情况下,答案是“以上全部”。尽管大多数Set和 的Map顺序不可信,但它仍然是确定性的,并且将保持不变,直到底层实现发生更改(例如,如果您更改或升级 JVM)。

然而,可预测的顺序更重要——它意味着集合保证在迭代集合时返回顺序项。您上面提到的两种“链接”类型都是这样做的 - 项目插入集合的顺序就是它们在迭代集合时返回的顺序。“树”类型还保证迭代的确定性顺序 - 排序的顺序。

  • @user949300 我见过(编码错误的)应用程序在从 Java 1.4 升级到 Java 5 时隐式假定“HashMap”的迭代顺序会中断 - 它在同一个 JDK 中是确定性的,但无论如何都是不可预测的。 (2认同)