UML类图
使用场景
用来遍历集合或聚合对象,通常是为了统一遍历方式。如List集合的Iterator遍历,接下来将实现一个简易版的List集合和Iterator。
代码实现
迭代器抽象
public interface Iterator<E> {
public E first();
public E next();
public boolean hasNext();
public E currentItem();
}
聚合抽象,这里模拟Java中的List集合
public interface List<E> {
public void add(E e);
public E remove(int i);
public E get(int i);
public int size();
public Iterator<E> iterator();
}
具体聚合类,这里模拟Java中的ArrayList集合
import java.util.Arrays;
/**
* 简易版List容器
* @param <E> 容器中的元素
*/
public class ArrayList<E> implements List<E> {
private Object[] elements;
private static final Object[] EMPTY_ELEMENTDATA = {};
private int size;
public ArrayList(){
this.elements = EMPTY_ELEMENTDATA;
this.size = elements.length;
}
@Override
public void add(E e) {
if(elements.length - size == 0)elements = Arrays.copyOf(elements, this.size+1); //将elements元素复制到一个新数组,并将容量+1,最后又返回给elements数组
elements[size ++] = e;
}
@Override
public E remove(int i) {
if(this.size == 0 || i>=size){
throw new IndexOutOfBoundsException("当前集合为空,无法移除元素");
}
E oldValue = get(i);
int numMoved = this.size - i - 1; //删除i位置的元素后,需向前移动元素的个数
if(numMoved > 0){
System.arraycopy(elements, i+1, elements, i, numMoved); //将elements数组中第i+1个位置后的numMoved个元素移动到i位置
}
elements[--size] = null; //GC清理
return oldValue;
}
@SuppressWarnings("unchecked")
@Override
public E get(int i) {
if(this.size == 0 || i>=size){
throw new IndexOutOfBoundsException("下标越界");
}
return (E)elements[i];
}
@Override
public int size() {
return this.size;
}
public Iterator<E> iterator(){
return new Itr();
}
//迭代器
private class Itr implements Iterator<E>{
private int cursor = 0;
@Override
public E first() {
if(size == 0){
return null;
}
return get(0);
}
@Override
public E next() {
if(++cursor < size){
return get(cursor);
}
return null;
}
@Override
public boolean hasNext() {
return cursor != size;
}
@Override
public E currentItem() {
return get(cursor);
}
}
}
客户端实现
public class Client {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.remove(0);
for(Iterator<String> it = list.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
输出结果
b
c