1.迭代器设计模式
interface myIterator<Item> //定义一个接口
{
boolean hasNext();
void remove();
Item next();
}
interface myIterable<Item>
{
myIterator<Item> iterator(); //返回接口类型的方法
}
class myArrayList1<Item> implements myIterable<Item>
{
private Item[] elementData;
private int size;
public myArrayList1()
{
this(10); //默认的情况下,大小为10
}
public myArrayList1(int initialCapacity)
{
if(initialCapacity<0) //如果列表大小设置小于0,会报出异常
{
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
elementData = (Item[])new Object[initialCapacity]; //没有泛型数组,所以这里使用强制转换
}
//增加元素
public void add(Item obj)
{
//数组扩容
/*
数组扩容的基本方法,将size*2
*/
if(size>elementData.length-1)
{
Item[] newArray = (Item[])new Object[(size*3)/2+1];
//System.arraycopy(elementData, 0, newArray, 0, elementData.length);//也可以使用数组复制调用函数
for(int i=0;i<elementData.length;i++)
{
newArray[i] = elementData[i];
}
elementData = newArray; //将elementData指向新的数组
}
elementData[size++] = obj;
}
@Override
public myIterator<Item> iterator() { //Item
return new ArrayListIterator(); //返回一个迭代器对象
}
private class ArrayListIterator implements myIterator<Item>//Item类型
{
int i = 0;
@Override
public boolean hasNext() {
return i!=size;
}
@Override
public Item next() {
return elementData[i++]; //返回Item类型
}
@Override
public void remove() {
}
}
}
class myItrableTest
{
public static void main(String[] args)
{
myArrayList1<String> arrayList = new myArrayList1<>(3);
//1.add方法的验证
arrayList.add("3");
arrayList.add("4");
arrayList.add("5");
arrayList.add("6");
myIterator<String> it = arrayList.iterator(); //返回一个迭代器对象
while(it.hasNext())
{
System.out.print(it.next()+" ");
}
}
}
1、通过arrayList.iterator()返回了一个myIterator(迭代器)对象,该迭代器对象实现了三个方法hasNext(),next(),remove(),通过三个方法来对容器进行遍历。
2.注意Iterable和Iterator中使用的泛型Item,使用泛型因为返回的next()的值是Item类型,该类型就是集合中元素的类型。
3.自己对迭代器模式的理解:
其实迭代器模式,本质就是使用内部类对外部类的属性进行访问,定义的一个内部类的实例——迭代器(myIterator it),然后利用内部类可以访问外部类属性的特征来对外部类的成员进行操作(遍历).
参考:https://blog.csdn.net/zhengzhb/article/details/7610745