有一個場景是這樣的,我需要在一個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(">>>>>工作完畢<<<<<");
}