java  Iterator接口和LIstIterator接口分析

发布时间 - 2026-01-11 01:26:55    点击率:

java  Iterator接口和LIstIterator接口分析

目录

1.Iterator接口
2.ListIterator
3.Iterator和ListIterator的区别 

正文

在继续看ArrayList源码之前,先了解Iterator接口和ListIterator接口,下篇文章详细讲解ArrayList是如何实现它们的。

我们知道,接口只是一种规范,当继承接口并实现其中的方法时,要遵循接口对方法的说明。

1.Iterator接口

Iterator接口取代了Java集合框架中的Enumeratrion。Iterators不同于enumerations的地方主要有两点:

  Iterators允许调用者在迭代过程中从集合里移除元素;

  方法名得到了改善。

Iterator源码如下:

/**
 * An iterator over a collection. {@code Iterator} takes the place of
 * {@link Enumeration} in the Java Collections Framework. Iterators
 * differ from enumerations in two ways:
 * Iterators allow the caller to remove elements from the underlying collection during the iteration with well-defined semantics.
 * Method names have been improved.
 * This interface is a member of the Java Collections Framework.
 * @param <E> the type of elements returned by this iterator*/
public interface Iterator<E> {
  /**
   * Returns {@code true} if the iteration has more elements.
   * (In other words, returns {@code true} if {@link #next} would
   * return an element rather than throwing an exception.)
   * @return {@code true} if the iteration has more elements
   */
  boolean hasNext();

  /**
   * Returns the next element in the iteration.
   * @return the next element in the iteration
   * @throws NoSuchElementException if the iteration has no more elements
   */
  E next();

  /**
   * Removes from the underlying collection the last element returned
   * by this iterator (optional operation). This method can be called
   * only once per call to {@link #next}. The behavior of an iterator
   * is unspecified if the underlying collection is modified while the
   * iteration is in progress in any way other than by calling this
   * method.
   *
   * @implSpec
   * The default implementation throws an instance of
   * {@link UnsupportedOperationException} and performs no other action.
   *
   * @throws UnsupportedOperationException if the {@code remove}
   *     operation is not supported by this iterator
   *
   * @throws IllegalStateException if the {@code next} method has not
   *     yet been called, or the {@code remove} method has already
   *     been called after the last call to the {@code next}
   *     method
   */
  default void remove() {
    throw new UnsupportedOperationException("remove");
  }

  /**
   * Performs the given action for each remaining element until all elements
   * have been processed or the action throws an exception. Actions are
   * performed in the order of iteration, if that order is specified.
   * Exceptions thrown by the action are relayed to the caller.
   *
   * @implSpec
   * <p>The default implementation behaves as if:
   * <pre>{@code
   *   while (hasNext())
   *     action.accept(next());
   * }</pre>
   *
   * @param action The action to be performed for each element
   * @throws NullPointerException if the specified action is null
   * @since 1.8
   */
  default void forEachRemaining(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    while (hasNext())
      action.accept(next());
  }
}

Iterator接口定义了四个方法以及各个方法的功能,如果有类实现了这个接口,且实现了这些方法,这方法需要实现定义的功能,遵循这些规则:

  1).hasNext() 判断容器是否有下一个元素,有则返回true;

  2).next() 返回容器中的下一个元素;

  3).remove() 移除当前迭代器返回的最后一个元素。这个方法在每次调用next()方法之后只能调用一次;

  4).Java 8 增加forEachRemaining方法,它可以实现对余下的所有元素执行指定的操作。

更详细的说明请阅读源码中的注释。

2.ListIterator

ListIterator在Iterator基础上提供了add、set、previous等对列表的操作。但是ListIterator跟Iterator一样,仍是在原列表上进行操作。

ListIterator源码如下:

/**
 * An iterator for lists that allows the programmer
 * to traverse the list in either direction, modify
 * the list during iteration, and obtain the iterator's
 * current position in the list. A {@code ListIterator}
 * has no current element; its <I>cursor position</I> always
 * lies between the element that would be returned by a call
 * to {@code previous()} and the element that would be
 * returned by a call to {@code next()}.
 * An iterator for a list of length {@code n} has {@code n+1} possible
 * cursor positions, as illustrated by the carets ({@code ^}) below:
 * <PRE>
 *           Element(0)  Element(1)  Element(2)  ... Element(n-1)
 * cursor positions: ^      ^      ^      ^         ^
 * </PRE>
 * Note that the {@link #remove} and {@link #set(Object)} methods are
 * <i>not</i> defined in terms of the cursor position; they are defined to
 * operate on the last element returned by a call to {@link #next} or
 * {@link #previous()}.
 *
 * This interface is a member of the Java Collections Framework.*/
public interface ListIterator<E> extends Iterator<E> {
  // Query Operations

  /**
   * Returns {@code true} if this list iterator has more elements when
   * traversing the list in the forward direction. (In other words,
   * returns {@code true} if {@link #next} would return an element rather
   * than throwing an exception.)
   *
   * @return {@code true} if the list iterator has more elements when
   *     traversing the list in the forward direction
   */
  boolean hasNext();

  /**
   * Returns the next element in the list and advances the cursor position.
   * This method may be called repeatedly to iterate through the list,
   * or intermixed with calls to {@link #previous} to go back and forth.
   * (Note that alternating calls to {@code next} and {@code previous}
   * will return the same element repeatedly.)
   *
   * @return the next element in the list
   * @throws NoSuchElementException if the iteration has no next element
   */
  E next();

  /**
   * Returns {@code true} if this list iterator has more elements when
   * traversing the list in the reverse direction. (In other words,
   * returns {@code true} if {@link #previous} would return an element
   * rather than throwing an exception.)
   *
   * @return {@code true} if the list iterator has more elements when
   *     traversing the list in the reverse direction
   */
  boolean hasPrevious();

  /**
   * Returns the previous element in the list and moves the cursor
   * position backwards. This method may be called repeatedly to
   * iterate through the list backwards, or intermixed with calls to
   * {@link #next} to go back and forth. (Note that alternating calls
   * to {@code next} and {@code previous} will return the same
   * element repeatedly.)
   *
   * @return the previous element in the list
   * @throws NoSuchElementException if the iteration has no previous
   *     element
   */
  E previous();

  /**
   * Returns the index of the element that would be returned by a
   * subsequent call to {@link #next}. (Returns list size if the list
   * iterator is at the end of the list.)
   *
   * @return the index of the element that would be returned by a
   *     subsequent call to {@code next}, or list size if the list
   *     iterator is at the end of the list
   */
  int nextIndex();

  /**
   * Returns the index of the element that would be returned by a
   * subsequent call to {@link #previous}. (Returns -1 if the list
   * iterator is at the beginning of the list.)
   *
   * @return the index of the element that would be returned by a
   *     subsequent call to {@code previous}, or -1 if the list
   *     iterator is at the beginning of the list
   */
  int previousIndex();


  // Modification Operations

  /**
   * Removes from the list the last element that was returned by {@link
   * #next} or {@link #previous} (optional operation). This call can
   * only be made once per call to {@code next} or {@code previous}.
   * It can be made only if {@link #add} has not been
   * called after the last call to {@code next} or {@code previous}.
   *
   * @throws UnsupportedOperationException if the {@code remove}
   *     operation is not supported by this list iterator
   * @throws IllegalStateException if neither {@code next} nor
   *     {@code previous} have been called, or {@code remove} or
   *     {@code add} have been called after the last call to
   *     {@code next} or {@code previous}
   */
  void remove();

  /**
   * Replaces the last element returned by {@link #next} or
   * {@link #previous} with the specified element (optional operation).
   * This call can be made only if neither {@link #remove} nor {@link
   * #add} have been called after the last call to {@code next} or
   * {@code previous}.
   *
   * @param e the element with which to replace the last element returned by
   *     {@code next} or {@code previous}
   * @throws UnsupportedOperationException if the {@code set} operation
   *     is not supported by this list iterator
   * @throws ClassCastException if the class of the specified element
   *     prevents it from being added to this list
   * @throws IllegalArgumentException if some aspect of the specified
   *     element prevents it from being added to this list
   * @throws IllegalStateException if neither {@code next} nor
   *     {@code previous} have been called, or {@code remove} or
   *     {@code add} have been called after the last call to
   *     {@code next} or {@code previous}
   */
  void set(E e);

  /**
   * Inserts the specified element into the list (optional operation).
   * The element is inserted immediately before the element that
   * would be returned by {@link #next}, if any, and after the element
   * that would be returned by {@link #previous}, if any. (If the
   * list contains no elements, the new element becomes the sole element
   * on the list.) The new element is inserted before the implicit
   * cursor: a subsequent call to {@code next} would be unaffected, and a
   * subsequent call to {@code previous} would return the new element.
   * (This call increases by one the value that would be returned by a
   * call to {@code nextIndex} or {@code previousIndex}.)
   *
   * @param e the element to insert
   * @throws UnsupportedOperationException if the {@code add} method is
   *     not supported by this list iterator
   * @throws ClassCastException if the class of the specified element
   *     prevents it from being added to this list
   * @throws IllegalArgumentException if some aspect of this element
   *     prevents it from being added to this list
   */
  void add(E e);
}

ListIterator的功能更加强大,定义的方法有:

  1).hasNext() 向前遍历时,如果有下一个元素返回真;

  2).next() 返回下一个元素的值,并将指针加1;

  3).hasPrevious() 向相反方向遍历时,如果还有元素返回真;

  4).previous() 返回上一个元素的值,并将指针前移1;

  5).nextIndex() 返回此时调用next()方法时返回的元素的索引;

  6).previousIndex() 返回此时调用previous()方法时返回的元素的索引;

  7).remove() 移除最近一次调用next()或previous()方法返回的元素(可选);

  8).set(E e) 用元素e将如果此时调用next()或previous()方法返回的元素替换掉;

  9).add(E e) 添加元素到此时调用next()返回的元素之前,或此时调用previous()返回的元素之后。

更详细的说明请阅读源码中的注释。

3.Iterator和ListIterator的区别

  Iterator和ListIterator的方法对比如下表:

Iterator

ListIterator

 

hasNext()

hasNext() 覆盖

next()

next() 覆盖

remove()

remove() 覆盖

forEachRemaining(Consumer<? super E> action)

forEachRemaining(Consumer<? super E> action) 继承
  hasPrevious()  
  previous()  
  nextIndex()  
  previousIndex()  
  set(E e)  
  add(E e)  

二者的不同之处主要有:

  1).Iterator只能单向移动,ListIterator可以双向移动;

  2).ListIterator可以删除、替换或添加元素,而Iterator只能删除元素;

  3).ListIterator可以返回当前(调用next()或previous()返回的)元素的索引,而Iterator不能。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java  # Iterator接口和LIstIterator接口  # Iterator接口和LIstIterator接口源码比较  # 详解JAVA中ListIterator和Iterator的辨析  # java中Iterator和ListIterator实例详解  # Java中的List接口实现类解析  # java中List接口与实现类介绍  # Java for循环和foreach循环的性能对比分析  # java foreach循环为什么不能赋值的讲解  # 为什么在foreach循环中JAVA集合不能添加或删除元素  # Java List接口与Iterator接口及foreach循环使用解析  # 移除  # 并将  # 实现了  # 迭代  # 是在  # 基础上  # 希望能  # 它可以  # 可选  # 谢谢大家  # 如何实现  # 下表  # 过程中  # 不同之处  # 表上  # 有两点  # 得到了  # 前移  # 主要有  # 调用者 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 米侠浏览器网页图片不显示怎么办 米侠图片加载修复  实例解析angularjs的filter过滤器  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel观察者模式如何使用_Laravel Model Observer配置  WEB开发之注册页面验证码倒计时代码的实现  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  做企业网站制作流程,企业网站制作基本流程有哪些?  如何在局域网内绑定自建网站域名?  如何实现建站之星域名转发设置?  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Firefox Developer Edition开发者版本入口  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  韩国服务器如何优化跨境访问实现高效连接?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  android nfc常用标签读取总结  如何用狗爹虚拟主机快速搭建网站?  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  想要更高端的建设网站,这些原则一定要坚持!  深圳网站制作的公司有哪些,dido官方网站?  怎样使用JSON进行数据交换_它有什么限制  如何安全更换建站之星模板并保留数据?  香港网站服务器数量如何影响SEO优化效果?  图册素材网站设计制作软件,图册的导出方式有几种?  Python文件流缓冲机制_IO性能解析【教程】  Laravel如何处理文件下载请求?(Response示例)  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  如何快速搭建高效WAP手机网站?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Java解压缩zip - 解压缩多个文件或文件夹实例  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  如何登录建站主机?访问步骤全解析  Linux后台任务运行方法_nohup与&使用技巧【技巧】  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  移动端脚本框架Hammer.js  Java垃圾回收器的方法和原理总结  香港服务器选型指南:免备案配置与高效建站方案解析  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Linux安全能力提升路径_长期防护思维说明【指导】  教学论文网站制作软件有哪些,写论文用什么软件 ?