编程语言
首页 > 编程语言> > java基础--迭代器

java基础--迭代器

作者:互联网

本次讨论java集合框架中迭代器的实现

使用迭代器可以更好的保护集合本身的数据的安全性,将遍历操作与集合本身功能分离。

迭代器定义了同一的操作接口,对容器底部不同的数据结构,操作者可以忽略,只需要了解迭代器本身的接口,对于不同数据结构的容器,数据的获取将有迭代器的实现类实现。一般情况,迭代只能是单向操作的,对于容器的操作主要是遍历。迭代器模式也是一种设计模式,下面介绍一下练习;

步骤:

  1. 创建MyIterator 接口,定义统一的操作方法
  2. 创建MyIterable接口,使实现改接口的类,实现获取迭代器的对象。
  3. 自定义集合容器,实现MyIterable接口,提供获取迭代器的接口
  4. 在容器中创建实现myIterator的内部类,实现接口中的方法

结构
在这里插入图片描述

1. 创建迭代器接口

package day14_list.iteratorPack;

/**
 * 自定义迭代器接口
 *
 * @author  mahao
 * @date:  2019年3月2日 下午3:24:41
 */
public interface MyIterator<E> {
	
	public boolean hasNext();
	
	public E next();
	
	public E remove();
}

2.创建 MyIterable接口

public interface MyIterable<T> {
	
	MyIterator<T> getIterator();
}

3.实现自定义集合容器,创建内部类

package day14_list.iteratorPack;

import java.util.ArrayList;
import java.util.ConcurrentModificationException;

/**
 * 自定义集合容器
 *
 * @author mahao
 * @param <E>
 * @date: 2019年3月2日 下午3:28:22
 */
public class MyList<E> extends ArrayList<E> implements MyIterable<E> {

	/**
	 * 实现获取迭代器的接口
	 */
	@Override
	public MyIterator<E> getIterator() {
		return new Iter2();
	}

	private class Iter2 implements MyIterator<E> {

		int myCourse;//下表
		int mySize = size();
		int lastRet = -1;
		
		@Override
		public boolean hasNext() {		
			return myCourse != mySize;
		}

		@Override
		public E next() {
			if(mySize!=size())//jdk中是禁止迭代过程中,进行其他线程进行数据更改
				throw new ConcurrentModificationException("迭代器遍历过程中发生更改");
			if(myCourse < mySize) {
				lastRet=myCourse;
				return get(myCourse++);
			}else {
				throw new IndexOutOfBoundsException("没有这个元素异常,数组越界");
			}			
		}

		public E remove() {
			if(lastRet<0)
				throw new IllegalStateException("无最近遍历操作"); 
			E e = MyList.this.remove(lastRet);
			if(myCourse > lastRet)
				myCourse--;
			lastRet = -1;
			mySize = size();
			return e;
		}
	}
}


测试

/**
 * 集合容器中迭代器分析
 *
 * @author  mahao
 * @date:  2019年3月2日 下午3:15:31
 */
public class IteratorDemo {
	
	public static void main(String[] args) {
		MyList<String> list = new MyList<String>();
		list.add("001");	
		list.add("002");	
		list.add("003");	
		list.add("004");
		
		//迭代器遍历最好采用for循环,iterator对象,在for循环结束后就会被回收
		//,while则是方法结束后才会变量失效。
		for(MyIterator<String> it = list.getIterator();it.hasNext();) {
			String str = it.next();
			if(str.equals("003")) {
				it.remove();
			}
			System.out.println(str);
		}
		System.out.println(list);	
	}
}

	

结果

标签:java,myCourse,迭代,list,MyIterator,基础,接口,public
来源: https://blog.csdn.net/mahao25/article/details/88077937