犯傻: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(">>>>>工作完毕<<<<<");
		}

 

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