首頁(yè)常見問(wèn)題正文

HashMap為什么不能一邊遍歷一遍刪除?

更新時(shí)間:2023-07-05 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  在使用HashMap進(jìn)行遍歷和刪除操作時(shí),不能在遍歷過(guò)程中直接刪除元素,這是因?yàn)镠ashMap的迭代器設(shè)計(jì)不支持在遍歷時(shí)對(duì)集合進(jìn)行結(jié)構(gòu)性修改。當(dāng)在遍歷過(guò)程中直接刪除元素時(shí),會(huì)導(dǎo)致迭代器的狀態(tài)與實(shí)際集合的狀態(tài)不一致,可能引發(fā)ConcurrentModificationException(并發(fā)修改異常)。

  具體來(lái)說(shuō),當(dāng)創(chuàng)建HashMap的迭代器時(shí),會(huì)生成一個(gè)"modCount"字段,表示HashMap結(jié)構(gòu)性修改的次數(shù)。每當(dāng)對(duì)HashMap進(jìn)行插入、刪除等操作時(shí),"modCount"都會(huì)增加。而在迭代器遍歷HashMap時(shí),會(huì)將當(dāng)前的"modCount"與之前保存的"expectedModCount"進(jìn)行比較,如果兩者不相等,則會(huì)拋出ConcurrentModificationException。

  下面我們看一個(gè)簡(jiǎn)單的代碼示例,演示了在遍歷HashMap過(guò)程中刪除元素可能導(dǎo)致的異常:

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

public class HashMapDemo {
    public static void main(String[] args) {
        Map<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "A");
        hashMap.put(2, "B");
        hashMap.put(3, "C");

        Iterator<Integer> iterator = hashMap.keySet().iterator();
        while (iterator.hasNext()) {
            Integer key = iterator.next();
            if (key == 2) {
                hashMap.remove(key); // 在遍歷過(guò)程中直接刪除元素
            }
        }
    }
}

  在上述代碼中,嘗試在遍歷HashMap時(shí)刪除元素,當(dāng)刪除key為2的元素時(shí),會(huì)拋出ConcurrentModificationException異常。

  為了避免這種異常,可以通過(guò)使用迭代器的remove()方法進(jìn)行安全的刪除操作。下面是修改后的代碼示例:

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

public class HashMapDemo {
    public static void main(String[] args) {
        Map<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "A");
        hashMap.put(2, "B");
        hashMap.put(3, "C");

        Iterator<Integer> iterator = hashMap.keySet().iterator();
        while (iterator.hasNext()) {
            Integer key = iterator.next();
            if (key == 2) {
                iterator.remove(); // 使用迭代器的remove()方法刪除元素
            }
        }
    }
}

  在修改后的代碼中,使用了迭代器的remove()方法進(jìn)行刪除操作,這樣可以避免ConcurrentModificationException異常的發(fā)生。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!