迭代器作为一种设计模式,可以用于遍历一个对象,主要实现了Iterator和Iterable两个接口。
Iterator接口:
Package java.util;
publicinterface Iterator<E> {
boolean hasNext();//判断是否存在下一个对象元素
E next();
void remove();
}
Iterable接口:
package java.lang;
import java.util.Iterator;
/**
* Implementing this interface allows an object to be the target of
* the "foreach" statement.
*
* @param <T> the type of elements returned by the iterator
*
* @since 1.5
*/
public interface Iterable<T> {
/**
* Returns an iterator over a set of elements of type T.
*
* @return an Iterator.
*/
Iterator<T> iterator();
}
看介绍,我们知道,Iterable提供了一个创建Iterator对象的方法,另外,实现这个接口,可以使用foreach。
下面,我们照抄ArrayList,实现一个简单的迭代器,了解一下原理,使用一下泛型:
package com.ws.generic;
import java.util.Arrays;
import java.util.Iterator;
// 定义泛型类实现Iterable方法
public class MyArrayList<E> implements Iterable<E>{
// 数组存储
private Object element[] = new Object[3];
// 尺寸
private int size = 0;
// 提供一个读取size的方法
public int size(){
return this.size;
}
// 在数组末尾增加数据
public void add(E ele){
if (element.length == size){
element = Arrays.copyOf(element, element.length*2+1);
}
element[size ] = ele;
size++;
}
// 内部类,实现Iterator接口,使用泛型
private class Myiter<E> implements Iterator<E>{
// 计数器 -->指针 游标
private int cursor = -1;
// 判断是否存在下一个
@Override
public boolean hasNext() {
return cursor + 1 < size;
}
// 获取下一个
@Override
public E next() {
cursor++;
return (E) element[cursor];
}
// 删除下一个
@Override
public void remove() {
// 移动数组元素
System.arraycopy(element, cursor + 1, element, cursor, size
- (cursor + 1));
// 实际大小-1
size--;
// 回退
this.cursor--;
}
}
// 实现Iterable接口
@Override
public Iterator<E> iterator() {
return new Myiter<E>();
}
public static void main(String[] args) {
MyArrayList<String> list = new MyArrayList<String>();
list.add("a1");
list.add("a2");
list.add("a3");
list.add("a4");
list.add("a5");
list.add("a6");
Iterator<String> it = list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
MyArrayList<Integer> list2 = new MyArrayList<Integer>();
list2.add(98);
list2.add(99);
list2.add(90);
// *** 增强for循环
for(Integer str:list2){
System.out.println(str);
}
}
}
代码很少就实现了,不会了可以去源代码里抄,本文主要理解一下Iterator和Iterable两个接口。