首先需要明确一点:迭代器指向的位置是元素之前的位置,如图所示:
假设集合List是由List1、List2和List3组成,当使用语句:Iterator it=List.iterator()时,迭代器it指向的位置是上图中Iterator1指向的位置,当使用语句:it.next()的时候,迭代器指向的位置后移到了上图中Iterator2所指向的位置。
一、Iterator迭代器
包含的方法:
hasNext():如果迭代器后面的位置还有元素,返回true,否则返回false。
next():返回集合中Iterator指向位置后面的元素。
remove():删除集合中Iterator指向位置后面的元素。
自定义一个ArrayLlist类,然后自定义迭代器,实现上述的三个方法!代码演示如下:
class MyList implements Iterable{
private static int[] array;
private static final int CAPACITY=10;
private static int size;
public MyList(){
this(CAPACITY);
}
public MyList(int n){
array=new int[n];
size=0;
}
//扩容操作
public void grow(){
int newLength=CAPACITY+CAPACITY<<1;
array=Arrays.copyOf(array, newLength);
}
//添加元素:尾插法
public void add(int t){
if(size==CAPACITY){
grow();
}
array[size++]=t;
}
//获取元素
public int get(int pos){
if(pos<0 || pos>size){
return -1;
}
return array[pos];
}
//删除元素:按位置删除
public static void remove(int pos){
if(size==0){
return ;
}
if(pos<0 || pos>size){
return ;
}
for(int i=pos;i<size;i++){
array[i]=array[i+1];
}
size--;
}
public void show(){
for(int i=0;i<size;i++){
System.out.print(array[i]+" ");
}
System.out.println();
}
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return new DIYMyList();
}
class DIYMyList implements Iterator{
int before;//前一个元素的位置
int after;//后一个元素的位置
public DIYMyList(){
before=after=0;
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return before!=size;
}
@Override
public Object next() {
// TODO Auto-generated method stub
int i=before;
before=before+1;
after=i;
return array[after];
}
@Override
public void remove() {//这里直接调用MyList中的remove()方法。
// TODO Auto-generated method stub
MyList.remove(after);
}
}
}
二、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。
三、两者的区别
1、相同点
都属于迭代器,当需要对集合中的元素进行遍历且不需要干涉其遍历过程时,这两种迭代器都可以使用。
2、不同点
1)使用范围不同
Iterator可以适用于任何集合;而ListIterator只能用于List及其子类型。
2)继承关系
ListIterator extends Iterator
3)方法
ListIterator中有add()方法,可以向List中添加对象,但是Iterator不可以。
ListIterator可以定位当前索引的位置,可以实现对象的修改,但是Iterator不可以。
ListIterator可以实现逆向遍历,但是Iterator不可以。
四、两者的用法示例
代码演示:
LinkedList<String> list1=new LinkedList();
list1.add("1");
list1.add("2");
list1.add("3");
System.out.println("使用Iterator进行遍历:");
Iterator<String> iterator1=list1.iterator();
while(iterator1.hasNext()){
String str1=iterator1.next();
System.out.print(str1+" ");
}
System.out.println();
System.out.println("使用ListIterator进行遍历:");
ListIterator<String> iterator2=list1.listIterator();
while(iterator2.hasNext()){
String str2=iterator2.next();
System.out.print(str2+" ");
}
System.out.println();
}
结果示例: