ArryList和LinkedList遍历的方式肯定是不一样的,如果用for循环中遍历,那么每一种不同的容器实现遍历肯定不一样,要统一所有的容器的遍历(调用一样,但容器底层不一样),那么让每一种容器都实现Iterator接口,用此接口对容器进行遍历。
之所以把Iterator单独写成一个组件,聚合在Collection或Map内部,而不把元素遍历直接写在Collection或Map接口里,原因如下:
1、接口应当设计得越细越好,组件分开
2、当用户使用一个组件时,该组件要实现什么功能就是用什么接口,而不需要关心其他接口的实现。
说白了,就是把遍历功能单独封装成一个对象
Iterator迭代器接口,用于统一不同容器的迭代方式
package test;
public interface Iterator {
public boolean hasNext();
public Object next();
}
Collection顶级容器中返回一个Iterator对象,用于对容器进行迭代
package test;
public interface Collection {
public void add(Object o);
public int size();
//返回迭代器对象
public Iterator iterator();
}
ArrayList中用内部类来写具体的迭代方法
package test;
//手动写一个容器类,用数组模拟
public class ArrayList implements Collection {
// 数组大小为10,当数组中装满时,扩展空间,这样就可以实现无限多个
Object[] objects = new Object[10];
// index记录装了多少个对象
int index;
// 添加对象
public void add(Object o) {
if (index == objects.length) {
// 当现有数组满了就创建一个新的数组对象,这个数组对象创建为多大,java内部会有一个加权算法
Object[] newObjects = new Object[objects.length * 2];
// 把原数组内容copy到新数组中
System.arraycopy(objects, 0, newObjects, 0, objects.length);
// 元素组引用指向新数组
objects = newObjects;
}
objects[index] = o;
index++;
}
// 容器已装元素的个数
public int size() {
return index;
}
// 迭代器
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return new ArrayListIterator();
}
// 用内部类来写不同容器的迭代方式
private class ArrayListIterator implements Iterator {
//记录当前访问到哪一个index了。
private int currentindex=0;
@Override
public boolean hasNext() {
if (currentindex>=index)
return false;
else
return true;
}
@Override
public Object next() {
Object o=objects[currentindex++];
currentindex++;
return o;
}
}
}