1. 程式人生 > >java 增強for迴圈 和可變引數

java 增強for迴圈 和可變引數

JDK5中定義了一種新的語法----增強for迴圈,以簡化遍歷操作。增強for迴圈只能用在陣列或實現Iterable介面的集合上.

for(元素的資料型別  變數 : 陣列或者集合) {
        對變數進行操作                        //該變數就是集合或者陣列中的元素
    }

三種遍歷方式的比較

  • 普通for迴圈,對索引進行自增,通過索引獲取元素值,可以刪除元素,但刪除後要讓索引做自減運算
  • 迭代器,通過迭代器物件(真實集合的一個對映),來遍歷每個元素,可以通過迭代器自身的remove方法刪除元素,如果在迭代器使用過程中使用集合的方法來刪除或者增加元素,會出現併發修改異常
  • 增強for迴圈,不能刪除元素

迭代器:

        Iterator是工作在一個獨立的執行緒中,並且擁有一個 mutex 鎖。 Iterator被建立之後會建立一個指向原來物件的單鏈索引表,當原來的物件數量發生變化時,這個索引表的內容不會同步改變,所以當索引指標往後移動的時候就找不到要迭代的物件,所以按照 fail-fast 原則 Iterator 會馬上丟擲

 增強for迴圈的實際使用的是迭代器的普通for迴圈(List集合的程式碼),如下

for(Iterator it=list.iterator();it.hasNext();){

    System.out.println(it.next());
}
	

既然增強for迴圈使用了迭代器遍歷,那麼具有了一些迭代器的性質,在遍歷的過程中不允許修改集合中的值

三種遍歷方式的示例

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ForTest {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");

		for (int i = 0; i < list.size(); i++) {
			// 集合自身方法刪除元素的時候,後面的元素向前移動一位,其size()會變小,
			// 刪除完以後,索引要減小一位,因為此時被刪除元素的下一位元素已經移動到了被刪除元素的位置
			if (list.get(i).equals("c")) {
				list.remove(i);
				i--;
			}
		}

		// 迭代器本事是對集合的對映,在使用迭代器過程中,只能用迭代器的方法操作,
		// 迭代器這個對映會改變,然後更新到集合中.不能使用集合自身的方法刪除元素
		Iterator<String> it = list.iterator();
		while (it.hasNext()) {
			if (it.next().equals("b")) {
				it.remove();// 迭代器的方法
			}
		}

		for (String s : list) {
			if (s.equals("d")) {
				// list.remove(s);//報錯,併發性修改異常,增強for迴圈底層使用iterator模式的普通for迴圈
			}
		}

		System.out.println(list);
	}
}
out:
[a,d]

參考:http://www.monkey1024.com/javase/561