有一个场景是这样的,我需要在一个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(">>>>>工作完毕<<<<<");
}