今天在看ArrayList的源码的时候,发现了一个神奇的东西,就是list的迭代器,用于list的循环迭代器,就是iterator和listiterator这两个,那么既然都是list的迭代器,那么这两个有什么不同的呢?下面整理一下这两个的不同点:
- listiterator接口继承于iterator,iterator是一个大接口。
- listiterator是专门为list提供的迭代器,而iterator是集合类的相关迭代器。
- listiterator是方法有很多,比如说有add、hasPrevious、remove、set等方法,而iterator却只有相关的hasNext、next、remove这三个方法。
- listiterator是在遍历的时候,逆向遍历相关元素,利用方法hasPrevious,而iterator不可以,只能乖乖的进行遍历。
- listiterator可以获取到返回元素的相关索引,利用方法nextIndex和previousIndex,而iterator不能。
- listiterator可以对元素进行修改,利用set方法(用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。只有在最后一次调用 next 或 previous 后既没有调用 ListIterator.remove 也没有调用 ListIterator.add 时才可以进行该调用。 ),而iterator不可以进行此类操作,只能进行遍历操作。
相关示例代码如下:
public static void main(String[] args) {
//声明list
List<Object> slist = new ArrayList<Object>();
Set<Object> sset = new HashSet<Object>();
slist.add("a1");
slist.add("b1");
slist.add("c1");
sset.add("hello");
sset.add("apple");
sset.add("clean");
//对于set集合的遍历
Iterator<Object> iterator = sset.iterator();
while(iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}
//对于list集合的遍历,利用listiterator方法进行
ListIterator<Object> listIterator = slist.listIterator();
while(listIterator.hasNext()){
Object next = listIterator.next();
//利用listiterator中的set方法修改相关元素
listIterator.set("456789");
System.out.println(next);
}
//对于list集合的遍历,利用iterator方法进行
Iterator<Object> iterator2 = slist.iterator();
while(iterator2.hasNext()){
Object next = iterator2.next();
System.out.println(next);
}
}
输出的结果是:
apple
hello
clean
a1
b1
c1
456789
456789
456789
如果没有加listiterator.set的话,那么输出的结果是:
apple
hello
clean
a1
b1
c1
a1
b1
c1
这就是listiterator和iterator的相关区别,希望可以的话能够帮助到大家,如果不好的地方,可以踊跃发发言。