可能大家都沒有注意,Collection接口的父接口是java.lang.Iterable
在這個接口中定義的是iterator方法
并且這個接口中指出 “實作這個接口允許對象成為 "foreach" 語句的目标”
這就是說,所有的集合類都要實作iterator方法
都可以傳回一個Iterator對象,完成疊代功能
下面寫一個示例代碼示範一下package iterator;
import java.util.Iterator;
/*
* Jimliu
*
* 這個例子為了試驗java.lang.Iterable接口中提到的:
* 實作這個接口允許對象成為 "foreach" 語句的目标。
* 自己實作一個儲存int資料的ArrayList,可以動态增長
* 擴容的算法是 size = size + size/2 + 1;
* 提供get/add/toString/size/iterator方法和兩種構造方式
* 實作Iterable接口,允許對象成為 "foreach"語句的目标(見測試類print3方法)
* 實作一個成員内部類Iterator(疊代器),通過它操作外部類的屬性,實作hasNext和next方法
*/
public class MyIntArrList implements Iterable
{
private static final int DEFAULT_SIZE = 10; // 初始預設大小
private int size; // 目前數組最大儲存多少元素
private int[] arr; // 儲存int值的數組
private int index; // 目前有效元素個數
public int size()
{
return index;
}
public MyIntArrList()
size = DEFAULT_SIZE;
arr = new int[size];
index = 0;
public MyIntArrList(int size)
if (size <= 0)
{
throw new IllegalArgumentException("size must be > 0");
}
this.size = size;
arr = new int[this.size];
public void add(int n)
if (index == size) // 檢視是否滿了
size = size + size / 2 + 1; // 擴容
int[] tmp = new int[size];
System.arraycopy(arr, 0, tmp, 0, index); // 拷貝
arr = tmp;
arr[index] = n;
index++;
public int get(int ind)
if (ind < 0 || ind >= index)
throw new ArrayIndexOutOfBoundsException(ind);
return arr[ind];
public String toString()
StringBuffer sb = new StringBuffer("[");
for (int i = 0; i < index; i++)
sb.append(arr[i]);
if (i != index - 1)
sb.append(", ");
sb.append("]");
return sb.toString();
public Iterator iterator()
return new MyIterator(); // 成員内部類MyIterator
/*
* 私有這個類,外界不能主動建立這個類的對象
* 隻能通過外部類的iterator()方法傳回一個疊代器對象
* 使用者得到這個疊代器類的對象後,
* 可以調用公開的hasNext和next方法進行疊代操作
* remove方法沒有實作,抛出異常
*/
private class MyIterator implements Iterator // 實作Iterator接口
private int cnt = 0; // 目前疊代的下标
public boolean hasNext()
return cnt != index; // 沒有疊代到最後就傳回true
public Object next() // 儲存目前資料,對cnt++,然後傳回儲存好的資料
int n = arr[cnt];
cnt++;
return n;
public void remove() // 不支援,抛出不支援操作異常
throw new UnsupportedOperationException();
}
複制代碼下面是這個類的測試類package iterator;
public class Test
public static void main(String[] args)
MyIntArrList ti = new MyIntArrList();
for(int i=0; i<40; i++)
ti.add(i);
System.out.println(ti.toString());
print1(ti);
print2(ti);
print3(ti);
// for get
public static void print1(MyIntArrList ti)
System.out.println("=== for get ===");
for (int i=0; i<ti.size(); i++)
System.out.print(ti.get(i)+" ");
System.out.println();
// iterator
public static void print2(MyIntArrList ti)
System.out.println("=== iterator ===");
Iterator it = ti.iterator();
while(it.hasNext())
Object o = it.next();
System.out.print(o + " ");
// foreach
public static void print3(MyIntArrList ti)
System.out.println("=== for each ===");
for (Object o : ti)
本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/wws5201985/814831,如需轉載請自行聯系原作者