犯傻:Map移除元素,怎麼可以用同一個Iterator做二次迭代呢?

有一個場景是這樣的,我需要在一個Map中取走兩個值,然後把取走的這兩個鍵值對移除,我犯了一個特別蠢的錯誤,竟然採用了這樣的方式(Iterator做二次迭代):

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class BaoShanTest {
	public static void main(String[] args) {
		Map<String, String> customMap = new HashMap<String, String>();

		customMap.put("1", null); //移除對象1

		customMap.put("2", "22"); //移除對象2

		customMap.put("3", "33");
		// 獲取錯誤
		String error = customMap.get("1");
		System.out.println(error);
		
		Iterator<Map.Entry<String, String>> it = customMap.entrySet().iterator();
		while (it.hasNext()) {
			Map.Entry<String, String> entry = it.next();
			if (entry.getKey().equals("1")) {
				it.remove();// 移除error
			}
		}
		
		// 獲取實際繳費金額
		String payAmount = customMap.get("2");
		System.out.println(payAmount);
		
		while (it.hasNext()) {
			Map.Entry<String, String> entry = it.next();
			if (entry.getKey().equals("2")) {
				it.remove();// 移除金額
			}
		}
		for (Map.Entry<String, String> a : customMap.entrySet()) {

			System.out.println("鍵是" + a.getKey());

			System.out.println("值是" + a.getValue());

		}

	}
}

結果啪啪啪打臉了,壓根沒移除對象2,我們打個簡易斷點,比如這樣:

發現沒有?迭代器壓根沒進第2個while,這是爲什麼呢?

因爲迭代器本來就只能調用一次,遍歷完畢之後,指針就已經移動至最末,再使用it.hasNext(),肯定返回false,自然就沒進第2個while,如果我們想要迭代第2次,非常簡單,加入第2個迭代器,比如:

Iterator<Map.Entry<String, String>> it2 = customMap.entrySet().iterator();
		while (it2.hasNext()) {
			System.out.println(">>>>>進來<<<<<");
			Map.Entry<String, String> entry = it2.next();
			if (entry.getKey().equals("2")) {
				it2.remove();// 移除金額
			}
			System.out.println(">>>>>工作完畢<<<<<");
		}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章