【问题标题】:Difference between Iterator and Listiterator?迭代器和Listiterator的区别?
【发布时间】:2012-06-14 05:36:07
【问题描述】:
Iterator ite = Set.iterator();
Iterator ite = List.iterator();

ListIterator listite = List.listIterator();

我们可以使用Iterator 来遍历SetListMap。但是ListIterator只能用来遍历List,不能遍历Set。为什么?

我知道主要区别在于使用迭代器我们只能在一个方向上移动,但使用ListIterator 我们可以双向移动。还有其他区别吗? ListIteratorIterator 有什么优势?

【问题讨论】:

  • 除了 Peters 的回答之外,我还建议您阅读 Java 中关于迭代器的思考一章,其中包含所有不错的示例

标签: java list iterator set listiterator


【解决方案1】:

ListIterator 的 Javadoc 中列出了不同之处

你可以

  • 向后迭代
  • 随时获取迭代器。
  • 随时添加新值。
  • 此时设置一个新值。

【讨论】:

  • 而你不能用Set 做到这一点的原因很简单:没有“当前点”:元素没有索引,也没有有用的方法可以添加元素“之前”或“之后”另一个。
  • @Peter Lawrey 随时获取索引 - 是关于方法 previousIndex()nextIndex() ?
  • @gstackoverflow 检查 java.util.List#listIterator(int)
  • @kilonet 而不是 在任意点获取索引,是否应该将其表述为“在任意点获取迭代器”以避免混淆?
【解决方案2】:

有两个区别:

  1. 我们可以使用 Iterator 来遍历 Set 和 List 以及 Map 类型的 Objects。虽然 ListIterator 可以用于遍历 List 类型的对象,但不能用于遍历 Set 类型的对象。

    也就是说,我们可以通过Set和List获取一个Iterator对象,看这里:

    通过使用迭代器,我们可以从 Collection Object 中仅向前检索元素。

    迭代器中的方法:

    1. hasNext()
    2. next()
    3. remove()
    Iterator iterator = Set.iterator();
    Iterator iterator = List.iterator();
  2. 但我们只能从 List 接口获取 ListIterator 对象,请看这里:

    ListIterator 允许您在任一方向(向前和向后)遍历。所以除了Iterator之外,它还有hasPrevious()previous()这两种方法。此外,我们可以获取下一个或前一个元素的索引(分别使用nextIndex()previousIndex()

    ListIterator 中的方法:

    1. hasNext()
    2. 下一个()
    3. 上一个()
    4. hasPrevious()
    5. 删除()
    6. nextIndex()
    7. previousIndex()
    ListIterator listiterator = List.listIterator();

    即,我们无法从 Set 接口获取 ListIterator 对象。

参考:-What is the difference between Iterator and ListIterator ?

【讨论】:

【解决方案3】:

Iterator 是 ListIterator 的超类。

以下是它们之间的区别:

  1. 使用iterator,您只能向前移动,但使用ListIterator,您还可以在阅读元素时向后移动。
  2. 使用ListIterator,您可以在遍历时随时获取索引,这是iterators 无法做到的。
  3. 使用iterator,您只能检查下一个元素是否可用,但在listiterator 中,您可以检查上一个和下一个元素。
  4. 使用listiterator,您可以在任何时间点添加新元素,同时遍历。 iterator 不可能。
  5. 使用listiterator,您可以在遍历时修改元素,而iterator 则无法做到这一点。

迭代器外观:

 public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional-->use only once with next(), 
                         dont use it when u use for:each
    }

ListIterator 外观:

public interface ListIterator<E> extends Iterator<E> {
    boolean hasNext();
    E next();
    boolean hasPrevious();
    E previous();
    int nextIndex();
    int previousIndex();
    void remove(); //optional
    void set(E e); //optional
    void add(E e); //optional
}

【讨论】:

    【解决方案4】:

    下面是iterator和listIterator的区别

    迭代器:

    boolean hasNext();
    E next();
    void remove();
    

    列表迭代器:

    boolean hasNext();
    E next();
    boolean hasPrevious();
    E previous();
    int nextIndex();
    int previousIndex();
    void remove();
    void set(E e);
    void add(E e);
    

    【讨论】:

      猜你喜欢
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2010-11-20
      • 2015-11-18
      相关资源
      最近更新 更多