【Java】增強for迴圈,三種迭代的能否刪除

love_Aym發表於2018-04-26

1、目的:簡化陣列和Collection集合的遍歷

2、格式:

        for(元素資料型別 變數 : 陣列或者Collection集合){

                使用變數即可,該變數就是元素

        }

3、陣列,集合儲存元素用增強for遍歷

1)陣列

int[] arr = {11,22,33,44,55};
    for (int i : arr) {
	System.out.println(i);
    }

2)集合

ArrayList<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
		
    for (String string : list) {
	System.out.println(string);
    }


4、三種迭代的能否刪除

  • 普通for迴圈,可以刪除,但是索引要--(自減),不然會邊刪集合元素在向前移動,同時指標也會向下移動,就會漏掉
  • 迭代器,可以刪除,但是必須使用迭代器自身的remove方法,否則會出現併發修改異常
  • 增強for迴圈不能刪除,因為增強for迴圈底層用的是迭代器
        ArrayList<String> list = new ArrayList<>();
	list.add("a");
	list.add("b");
	list.add("b");
	list.add("c");
	list.add("d");
		
	//1,普通for迴圈刪除,索引要--
	for(int i = 0; i < list.size(); i++) {
	    if("b".equals(list.get(i))) {
		list.remove(i--);  //如果不--,就會漏刪
		}
	}
		
	//2,迭代器刪除
	Iterator<String> it = list.iterator();
	    while(it.hasNext()) {
		if("b".equals(it.next())) {
			//list.remove("b");	//不能用集合的刪除方法,因為迭代過程中如果集合修改會出現併發修改異常
			it.remove();		//操作自身的東西就可以
		}
	}

	//迭代器的另一種寫法	
	for(Iterator<String> it2 = list.iterator(); it2.hasNext();) {
	    if("b".equals(it2.next())) {
		//list.remove("b");	//不能用集合的刪除方法,因為迭代過程中如果集合修改會出現併發修改異常
		it2.remove();    
	    }
	}

	//3,增強for迴圈,增強for迴圈不能刪除,只能遍歷,因為它的底層用的是迭代器,迭代器就不能刪除這裡也就不能刪除
	for (String string : list) {   
	    if("b".equals(string)) {
		list.remove("b");   
	    }
	}
	System.out.println(list);






相關文章