代码之家  ›  专栏  ›  技术社区  ›  Bobby

如何获取LinkedHashMap的KeyIterator?

  •  12
  • Bobby  · 技术社区  · 16 年前

    通过查看来自Sun的Linkedhashmaps的源代码,我发现有一个名为keyterator的私有类,我想使用它。如何获得访问权限?

    3 回复  |  直到 16 年前
        1
  •  43
  •   Michael Myers KitsuneYMG    16 年前

    你是打电话来的

    myMap.keySet().iterator();
    

    您甚至不需要知道它的存在;它只是一个实现的工件。就你所知,他们可以使用飞猴来迭代这些键;只要它们是根据规范进行迭代的,那么它们怎么做就无关紧要了。

    顺便问一下,你知道吗 HashMap 有一个名为 KeyIterator (同样) ConcurrentHashMap , ConcurrentSkipListMap , EnumMap , IdentityHashMap , TreeMap WeakHashMap )?
    这会影响您如何迭代 哈希图 ?


    编辑: 作为对您的评论的回应,请注意,如果您试图遍历 键值对 在一个 Map ,有一种比遍历键和调用 get 为每一个。这个 entrySet() 方法获取 Set 在所有的键值对中,您可以迭代这些键值对。所以不是写:

    for (Key key : myMap.keySet()) {
        Value val = myMap.get(key);
        ...
    }
    

    你应该写:

    for (Map.Entry<Key, Value> entry : myMap.entrySet()) {
        doSomethingWithKey(entry.getKey());
        doSomethingWithValue(entry.getValue());
        ...
    }
    

    您还可以使用 values() 如果你愿意的话。

    请注意,自 keySet , entrySet values 在中定义 Map interface 他们会为任何人工作 地图 不仅仅是 LinkedHashMap .

        2
  •  3
  •   Rob Hruska MegalomanINA    16 年前

    您不应该使用任何定义为LinkedHashMap内部实现的一部分的内容(即在源代码中,但在API中没有定义)。如果内部实现在下一个版本中发生更改,会发生什么?使用它的所有代码都将中断。

    你应该编码到 API 做一些类似的事情

    myMap.keySet().iterator()
    
        3
  •  3
  •   Mike Pone    16 年前

    它是一个私有类,所以不能直接使用它。

      private class KeyIterator extends LinkedHashIterator<K> {
    

    当使用普通迭代器时,会返回它的一个实例。

    myMap.keySet().iterator()