Iterator 和 ListIterator 有什么区别?
我们在使用集合的时候都会使用到迭代器(Iterator),迭代器依附与集合对象存在,本身不具备装载对象的能力。
迭代器的好处是
- 集合本身提供了访问对象各个元素的途径,同时不暴露对象的内部细节。
- 在遍历过程中可以删除元素,通过remove方法。
方法列表
首先我们看一下Iterator和ListIterator迭代器的方法有哪些个?
Iterator的方法

ListIterator的方法

在两者的方法中我们挑常用介绍
Iterator迭代器:
- hasNext():如果迭代器指向位置后面还有元素,则返回 true,否则返回false
- next():返回集合中Iterator指向位置后面的元素
- remove():删除集合中Iterator指向位置后面的元素
ListIterator迭代器:
- add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前
- hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false
- hasPrevious():如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false
- next():返回列表中ListIterator指向位置后面的元素
- nextIndex():返回列表中ListIterator所需位置后面元素的索引
- previous():返回列表中ListIterator指向位置前面的元素
- previousIndex():返回列表中ListIterator所需位置前面元素的索引
- remove():从列表中删除next()或previous()返回的最后一个元素
- set(E e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e
方法相同点
- 种方法都可以遍历集合元素使用
- 是集合中提供的内部方法
方法不同点
- Iterator在使用过程中,不能对集合元素进行添加操作,否则会抛出异常。
- 使用范围不同;Iterator可以在所有集合中使用,而ListIterator只能在List类型与子类型
- listIterator有add方法,可以向集合中添加元素,而iterator不能。
- listiterator和iterator都有hasnext和next方法可以顺序遍历元素, 但是listiterator有hasprevious和previous方法,可以逆向遍历元素
- listiterator可以定位当前的索引位置 nextIndex和previousIndex可以实现,iterator没有此功能
- listiterator可以实现对对象的修改set()方法可以实现,iterator仅可以遍历,不能修改。
代码实例
//测试迭代器的简单代码 // @Test public void TestIterator(){ List<String> aslist = new ArrayList<String>(); aslist.add("张三"); aslist.add("李四"); aslist.add("王五"); aslist.add("赵六"); aslist.add("田七"); Iterator<String> iterator = aslist.iterator(); aslist.set(0, "张小三");//这里只是创建了迭代器,并没有使用所以没有抛出异常 //正向遍历 int i=0; while(iterator.hasNext()){//此方法如果迭代器指向位置后面还有元素,则返回 true,否则返回false //输出语句结果 i++; String name=iterator.next(); if(name.equals("赵六")){ name=aslist.set(i, "赵小六"); //iterator.remove(); //使用删除方法删除此元素 } /*aslist.set(0, "张三"); * 在使用过程中有aslit中的set方法修改时是可以的, * 但是迭代器本身没有修改方法 * */ System.out.println(name); //aslist.add("陈八");//在迭代器使用的时候,向aslist添加元素抛出异常 } } @Test public void TestListIterator(){ List<Integer> aslist = new ArrayList<Integer>(); aslist.add(1); aslist.add(2); aslist.add(3); aslist.add(4); aslist.add(5); aslist.add(6); ListIterator<Integer> listIterator = aslist.listIterator(); //正向遍历 while(listIterator.hasNext()){ Integer integer = listIterator.next(); if(integer.equals(2)){ //迭代器自带修改方法 listIterator.set(20); } } ListIterator<Integer> listIterator2 = aslist.listIterator(aslist.size()); //反向遍历 //反向遍历要注意的是需要将集合的长度标明【aslist.listIterator(aslist.size())】,否则遍历会有问题 while(listIterator2.hasPrevious()){ Integer previous = listIterator2.previous(); System.out.println(previous); } }
