分析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();
	}

结果示例:

猜你喜欢

转载自blog.csdn.net/qq_40303781/article/details/84191376
今日推荐