java基础--迭代器
作者:互联网
本次讨论java集合框架中迭代器的实现
使用迭代器可以更好的保护集合本身的数据的安全性,将遍历操作与集合本身功能分离。
迭代器定义了同一的操作接口,对容器底部不同的数据结构,操作者可以忽略,只需要了解迭代器本身的接口,对于不同数据结构的容器,数据的获取将有迭代器的实现类实现。一般情况,迭代只能是单向操作的,对于容器的操作主要是遍历。迭代器模式也是一种设计模式,下面介绍一下练习;
步骤:
- 创建MyIterator 接口,定义统一的操作方法
- 创建MyIterable接口,使实现改接口的类,实现获取迭代器的对象。
- 自定义集合容器,实现MyIterable接口,提供获取迭代器的接口
- 在容器中创建实现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