java.util.ConcurrentModificationException 문제 해결

오늘 맵에서 키를 삭제할 가치가 있을 때 Iterator를 사용했습니다. 교체할 때 키 값을 삭제했는데 이상이 발견되었습니다. Exception inthread'main'java.util.ConcurrentModificationException at java.util.HashMap HashIterator.nextEntry(HashMap.java:922)atjava.util.HashMap KeyIterator.HashMap.java:956) 문제 분석: 원래 교체기를 사용할 때 KeySet(예를 들어 요소를 삽입하거나 삭제하는 것)을 바꾸면 List, Set, Map의size가 바뀌고, 반복할 때size 값을 검사하는데, 이때 교체기에 접근하면 이 이상을 보고합니다.해결 방법: 1. List, Set, Map의 일부 요소를 삭제하려면 먼저 list 용기를 만들고 Iterator를 훑어볼 때 삭제해야 할 요소를 저장한 다음removeAll(Collection)을 사용하여 통일적으로 삭제할 수 있다.테스트 코드:
public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("1", "1");
        map.put("2", "2");
        map.put("3", "3");
        map.put("4", "4");
        map.put("5", "5");
        Set<String> keySet = map.keySet();
        Iterator<String> itr = keySet.iterator();
        Set<String> removeSet = new HashSet<>();
        while (itr.hasNext()) {
            String key = itr.next();
            if (key.equals("1") || key.equals("2")) {
                removeSet.add(key);
            }
        }
        keySet.removeAll(removeSet); 
        for(String s : keySet){
            System.out.print(s+" ");
        }
    }

2. 일부 요소를 삭제하면 Iterator를 직접 사용할 수도 있습니다.remove () 방법;테스트 코드:
public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("1", "1");
        map.put("2", "2");
        map.put("3", "3");
        map.put("4", "4");
        map.put("5", "5");
        Set<String> keySet = map.keySet();
        Iterator<String> itr = keySet.iterator();
        while (itr.hasNext()) {
            String key = itr.next();
            if (key.equals("1") || key.equals("2")) {
                itr.remove();
            }
        }
        for(String s : keySet){
            System.out.print(s+" ");
        }
    }

3. 맵을 사용하면 ConcurrentHashMap을 사용하여 이런 문제의 발생을 피할 수 있다.4. List, Set, Map에 대한 수정 삭제 작업이 있을 때, 데이터를 훑어볼 때 교체기 Iterator를 사용하지 않습니다.

좋은 웹페이지 즐겨찾기