java 增強for迴圈 和可變引數
阿新 • • 發佈:2018-11-19
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]