java中的Iterator和ListIterator的区别

时间:2021-07-19 21:41:37

(一)iterator迭代器

Collection的iterator方法返回一个实现了一个Iterator接口的对象

Iterator接口中包含三个方法:

1)E next()

2)boolean hasNext()

3)void remove

具体用法:

Iterator<Integer> integers=collection.iterator();
while(integers.hasNext()){
System.out.print(integers.next()+" ");
}

可以通过调用hasNext()判断是否达到集合的末尾

调用next()方法返回访问到的元素

但是也可以通过foreach循环实现上述的方法

for(Integer i:collection){
System.out.print(i+" ");
}

编译器简单的将foreach循环翻译为带有迭代器的循环

foreach使用是有条件的,即其必须和实现了Iterable接口的对象一起工作,Collection接口扩展了Iterable接口,所以集合可以使用foreach循环

Iterator的作用:能够将遍历序列与序列底层的结构分开,通过它统一了对容器的访问

public class AddingGroups {
public static void display(Iterator<String>iterator){
while(iterator.hasNext()){
String s=iterator.next();
System.out.print(s+" "+" ");
}
System.out.println();
}
public static void main(String[] args) {
List<String> list1=new ArrayList<>(Arrays.asList("a","b","c"));
List<String> list2=new LinkedList<>(Arrays.asList("d","e","f"));
Set set1=new HashSet<>(Arrays.asList("g","h","i"));
Set set2=new TreeSet<>(Arrays.asList("j","k","l"));
display(list1.iterator());
display(list2.iterator());
display(set1.iterator());
display(set2.iterator());
}
}

通过iterator可以不管集合的类型信息了

(二)ListIterator迭代器

List迭代器继承Iterator,有更强大的功能,但是其有限制条件,它只能用于各种List的访问

ListIterator扩展的功能:

1)双向移动

2)可以通过nextIndex()和previousIndex()方法返回当前位置的前一个和后一个元素的索引

3)可以通过set()方法修改访问过的元素

4)通过调用listIterator(n)方法创建一个一开始就指向列索引为n的元素处的ListIterator

具体作用通过代码来演示,如下:

public class ListIterator {

    public static void main(String[] args) {
String[] s={"a","b","c","d","e","f","g","h","i"};
List<String>list= Arrays.asList(s);
java.util.ListIterator<String> it= list.listIterator();
while(it.hasNext()) {
System.out.println(it.next()+", "+it.nextIndex()+", "+it.previousIndex()+"; ");
}
System.out.println();
while(it.hasPrevious()){
System.out.print(it.previous()+" ");
}
System.out.println();
System.out.println(list);
//指向索引位置为3的地方
it=list.listIterator(3);
while(it.hasNext()){
it.next();
//索引位置从3开始的地方将集合内容改为xxx
it.set("xxx ");
}
System.out.println(list);
}
}