Iterator 和 ListIterator 都是 Java 集合框架中用于遍历集合元素的接口,但它们有一些区别:
使用的范围:Iterator可以迭代所有集合,而ListIterator 只能用于List及其子类。
继承关系:ListIterator 继承 Iterator,并且ListIterator包含的方法更多
遍历的方向:Iterator 接口只能向前遍历集合元素,而 ListIterator 接口可以双向遍历,即向前或向后遍历集合元素。
遍历的能力:Iterator 接口只能遍历集合,而 ListIterator 接口除了遍历集合元素外,还可以修改集合中的元素,添加新的元素,以及获取当前遍历位置的索引。
遍历的起点:Iterator 接口的遍历起点是集合的开头,而 ListIterator 接口可以通过 hasPrevious() 和 previous() 方法从集合的末尾开始遍历。
遍历的性能:Iterator 接口的遍历性能通常比 ListIterator 接口更好,因为 ListIterator 接口需要维护额外的指针和索引信息。
示例如下所示:
import java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator; public class Test{ public static void main(String[] args) { ArrayList<String> arrayList=new ArrayList<>(); arrayList.add("张三"); arrayList.add("李四"); arrayList.add("王五"); Iterator<String> iterator=arrayList.iterator(); System.out.println("iterator遍历的结果为:"); while(iterator.hasNext()){ String element=iterator.next(); System.out.print(element+" "); System.out.println(); } ListIterator<String> listIterator=arrayList.listIterator(); System.out.println("listIterator正向遍历的结果为:"); while(listIterator.hasNext()){ String element=listIterator.next(); if(element.equals("王五")){//在遍历过程中,修改集合中的元素 listIterator.set("Lisa"); } System.out.println(element+" "); } ListIterator<String> listIterator2=arrayList.listIterator(); System.out.println("listIterator修改后正向遍历的结果为:"); while(listIterator2.hasNext()){ String element=listIterator2.next(); System.out.println(element+" "); } System.out.println("listIterator修改后反向遍历的结果为:"); while(listIterator.hasPrevious()){ String element=listIterator.previous(); System.out.println(element+" "); } } }
输出如下所示:
iterator遍历的结果为: 张三 李四 王五 listIterator正向遍历的结果为: 张三 李四 王五 listIterator修改后正向遍历的结果为: 张三 李四 Lisa listIterator修改后反向遍历的结果为: Lisa 李四 张三