LinkedHashMap排序问题

8
LinkedHashMap Javadocs 中提到:

特别是,对 collection-views 的操作不会影响支持映射的迭代顺序。

"collection-views上的操作" 是什么意思?


“collection-views 上的操作” 指的是针对 LinkedHashMap 本身的操作。请参考我所提供的 Internal life of LinkedHashMap 教程。 - Volodymyr Levytskyi
3个回答

7

这个测试旨在展示它的工作原理。

    Map m = new LinkedHashMap(16, 0.75f, true);
    m.put(1, 1);
    m.put(2, 2);
    m.put(3, 3);
    System.out.println(m);
    m.get(2);
    System.out.println(m);
    Set keys = m.keySet(); //API: Returns a Set view of the keys contained in this map.
    keys.iterator().next();
    System.out.println(m);

输出

{1=1, 2=2, 3=3}
{1=1, 3=3, 2=2}
{1=1, 3=3, 2=2}

也就是说,访问条目2-2改变了迭代顺序,而访问键集视图上的第一个条目1-1没有改变迭代顺序。

7

Map接口的集合视图是由以下方法返回的对象:

  • Map#keySet():返回一个包含Map中所有键的集合。
  • Map#values():返回一个包含Map中所有值的集合。
  • Map#entrySet():返回一个包含Map中所有映射关系的集合,每个映射关系都以Map.Entry形式存在。

对于这些集合视图的操作,指的是对集合视图实例进行的任何方法调用。


任何对这些视图的操作都无法改变迭代顺序,因为您不能添加或获取。 - assylias
@assylias 我不确定;理论上可以迭代集合视图吗? - Matt Ball
1
LinkedHashMap有一个构造函数,按最近访问的元素排序,因此在这种情况下,集合视图上的contains或其他查找操作可能会影响迭代顺序,这是完全可以想象的。 - Louis Wasserman
2
@LouisWasserman,同一段落明确列出了生成访问的方法:get、put和putAll。而且没有任何视图具有这些方法,因此似乎是多余的。但是不可否认的是,这并没有错,所以不是什么大问题。 - assylias

3

如果我理解正确的话,集合视图是通过其抽象(如entrySet、values和keySet)获得的集合。

在这些集合中进行操作不会影响您的LinkedHashMap中对象的访问顺序,当您使用特殊构造函数使您的对象按访问顺序排序时。


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