1. 程式人生 > 程式設計 >Java中的迭代器和foreach原理

Java中的迭代器和foreach原理

迭代器是一種設計模式,它的定義為:提供一種方法訪問一個容器物件中的各個元素,而又不需暴露該容器物件的內部細節。迭代器模式,就是為容器而生。

在Java中,Iterator稱為迭代器,主要用於遍歷 Collection 集合中的元素。Iterator 僅用於遍歷集合,Iterator 本身並不提供承裝物件的能力。如果需要建立Iterator 物件,則必須有一個被迭代的集合。Collection介面繼承了java.lang.Iterable介面,該介面有一個iterator()方法,那麼所有實現了Collection介面的集合類都有一個iterator()方法,用以返回一個實現了Iterator介面的物件。並且集合物件每次呼叫iterator()方法都得到一個全新的迭代器物件,預設指標(遊標)都在集合的第一個元素之前。

1、Iterator介面中的常用方法

boolean hasNext():判斷集合中是否還有下一個元素
E next():返回下一個元素
void remove():刪除元素

注意:

  • 1.在呼叫next()方法之前必須要呼叫hasNext()方法進行判斷。如果下一條記錄無效,而且又沒有呼叫hasNext()方法進行判斷,那麼直接呼叫next()方法就會丟擲NoSuchElementException異常。
  • 2.Iterator可以刪除集合的元素,但是是通過迭代器物件的remove方法,不是集合物件的remove方法。
  • 3.如果還未呼叫next()方法或在上一次呼叫next()方法之後已經呼叫了remove()方法,再呼叫remove()方法都會報IllegalStateException異常。

2.Iterator的使用方法(遍歷集合)

Collection coll=new ArrayList();
coll.add(123);
coll.add(456);
coll.add(789);
coll.add(new Person("Tom",12));

Iterator iterator = coll.iterator();
while(iterator.hasNext()){
 System.out.println(iterator.next());
}

3、Iterator的執行原理

迭代器的執行原理如下圖所示:

Java中的迭代器和foreach原理

集合物件每次呼叫iterator()方法得到的迭代器物件,預設指標(遊標)都在集合的第一個元素之前。我們在使用迭代器時,首先會使用hasNext()方法判斷集合中是否還有下一個元素,如果有就會呼叫next()方法,呼叫next()方法分為兩個步驟:一是把當前指標下移一位,二是將下移以後位置上的元素返回,如上圖所示。

4、增強for迴圈:foreach

在Java 5.0提供了一種新的迭代訪問 Collection和陣列的方法,就是foreach迴圈。使用foreach迴圈執行遍歷操作不需獲取Collection或陣列的長度,也不需要使用索引訪問元素。
使用方法如下所示:

Java中的迭代器和foreach原理

public static void main(String[] args) {
 int[] ints={1,2,3,4};
 for (int i:ints) {
  System.out.println(i);
 }

 Collection coll = new ArrayList();
 coll.add(123);
 coll.add(456);
 coll.add(789);
 coll.add(new Person(1001,"Tom"));
 for (Object object:coll) {
  System.out.println(object);
 }
}

那麼foreach迴圈是怎樣實現的呢?
下面我們來看一下上述程式碼編譯後的原始碼檔案,如下所示:

Java中的迭代器和foreach原理

編譯後的原始碼如下:

public static void main(String[] args) {
  int[] ints = new int[]{1,4};
  int[] var2 = ints;
  int var3 = ints.length;

  for(int var4 = 0; var4 < var3; ++var4) {
   int i = var2[var4];
   System.out.println(i);
  }

  Collection coll = new ArrayList();
  coll.add(123);
  coll.add(456);
  coll.add(789);
  coll.add(new Person(1001,"Tom"));
  Iterator var7 = coll.iterator();

  while(var7.hasNext()) {
   Object object = var7.next();
   System.out.println(object);
  }

 }

由編譯後的原始碼可知,使用foreach迴圈遍歷陣列時,底層仍然是通過for迴圈實現的;而遍歷集合時,底層是通過迭代器實現的。

以上就是Java中的迭代器和foreach原理的詳細內容,更多關於Java 迭代器和foreach的資料請關注我們其它相關文章!