分析Iterator和ListIiterator這兩種迭代器~
首先需要明確一點:迭代器指向的位置是元素之前的位置,如圖所示:
假設集合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();
}
結果示例: