Java代码写了不少,但是就是碎片化的,现在系统的整理一下;
背景
在遍历集合的时候,经常使用Iterator和ListIterator,下面就解析一下两者的异同点。
相同点
- 都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。
不同点
- 使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
- ListIterator有add方法,可以向List中添加对象,而Iterator不能。
- ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
- ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
- 都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。
代码示例
1.IteratorInterface.java
package javacollection.iterator; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * @ClassName IteratorInterface * @Author zhangqx02 * @Date 2019/9/6 9:26 * @Description * * 迭代器接口 * Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型 * * *方法摘要 * *boolean hasNext() * *如果仍有元素可以迭代,则返回 true。 * * * *E next() * *返回迭代的下一个元素。 * * * *void remove() * *从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。 */ public class IteratorInterface { public static void main(String[] args){ List<String> list = new ArrayList<>(); list.add("Java"); list.add("is"); list.add("a"); list.add("very"); list.add("useful"); list.add("language"); list.add("!"); System.out.println("list: "+ list); Iterator<String> iterator = list.iterator(); StringBuffer sb = new StringBuffer(); while (iterator.hasNext()){ String str = iterator.next()+" "; sb.append(str); } System.out.println("sb: "+ sb.toString()); } }
2.listIteratorInterface.java
package javacollection.iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; /** * @ClassName listIteratorInterface * @Author zhangqx02 * @Date 2019/9/6 9:26 * @Description * 迭代器接口 * ListIterator只能用于List及其子类型。 * * * void add(E e) * * 将指定的元素插入列表(可选操作)。 * * boolean hasNext() * * 以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。 * * boolean hasPrevious() * * 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。 * * E next() * * 返回列表中的下一个元素。 * * int nextIndex() * * 返回对 next 的后续调用所返回元素的索引。 * * E previous() * * 返回列表中的前一个元素。 * * int previousIndex() * * 返回对 previous 的后续调用所返回元素的索引。 * * void remove() * * 从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。 * * void set(E e) * * 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。 */ public class listIteratorInterface { public static void main(String[] args){ List<String> list = new LinkedList<>(); list.add("Java"); list.add("is"); list.add("a"); list.add("very"); list.add("useful"); list.add("language"); list.add("!"); System.out.println("Before list: "+ list); ListIterator iterator = list.listIterator(); System.out.println("Next: "); //以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true) while (iterator.hasNext()){ //返回对 next 的后续调用所返回元素的索引 int index = iterator.nextIndex(); //返回列表中的下一个元素 String str = String.valueOf(iterator.next()); if ("!".equals(str)){ break; }else{ System.out.println(str + " " + index); } } System.out.println(); System.out.println("Previous: "); //果以逆向遍历列表,列表迭代器有多个元素,则返回 true。 while (iterator.hasPrevious()){ //返回对 previous 的后续调用所返回元素的索引。 int index = iterator.previousIndex(); //返回列表中的前一个元素。 String str = String.valueOf(iterator.previous()); if ("is".equals(str)){ //用指定元素替换 next 或 previous 返回的最后一个元素(可选操作) iterator.set("IS"); } System.out.println(str + " " +index); } System.out.println(); //从列表中移除由 next 或 previous 返回的最后一个元素(可选操作) iterator.remove(); System.out.println("list: "+list); //将指定的元素插入列表(可选操作) iterator.add("java"); System.out.println("list: "+list); } }