Java에서 ConcurrentModificationException을 처리하는 방법은 무엇입니까?
Java 프로그래밍에서 ConcurrentModificationException은 매우 일반적인 예외입니다. 이 예외는 반복자(Iterator) 또는 향상된 for 루프(foreach)를 사용하여 컬렉션을 반복할 때 자주 발생합니다. 이번 글에서는 이 예외의 원인과 해결 방법을 소개하겠습니다.
반복자를 사용하여 컬렉션을 순회할 때 순회 프로세스 중에 컬렉션의 요소가 수정(추가, 삭제 등)되면 ConcurrentModificationException 예외가 발생합니다. 이 예외가 발생하는 이유는 Iterator의 next() 메소드가 호출될 때 현재 modCount가 예상ModCount와 같은지 비교하기 때문입니다. 그렇지 않으면 반복 프로세스 중에 컬렉션이 변경되었음을 의미합니다. , 컬렉션 요소에 추가하거나 삭제하면 modCount의 값은 변경되지만 ExpectModCount의 값은 변경되지 않아 두 값이 동일하지 않게 되고 ConcurrentModificationException 예외가 발생합니다.
ConcurrentModificationException 발생을 방지하려면 컬렉션을 순회할 때 컬렉션 요소 수정을 피해야 합니다. 일반적으로 세 가지 해결 방법이 있습니다.
(1) 순회하려면 일반 for 루프를 사용하세요.
순회에 일반 for 루프를 사용하는 것은 반복자를 사용하는 대신 첨자를 통해 컬렉션의 요소에 대해 작업을 수행할 수 있기 때문에 실현 가능한 솔루션입니다. 그러나 이 방법은 사용하기가 더 까다롭고 더 많은 양의 코드가 필요합니다.
샘플 코드:
List<String> list = new ArrayList<>(); for(int i = 0; i < list.size(); i++) { String str = list.get(i); // 对str进行操作 }
(2) Iterator의 제거 메소드 사용
컬렉션을 탐색하는 동안 요소를 수정해야 하는 경우 Iterator의 제거 메소드를 사용하여 삭제 작업을 수행할 수 있습니다. 이 메소드를 사용하면 ConcurrentModificationException을 발생시키지 않고 next() 메소드에 대한 마지막 호출에서 반환된 요소를 삭제할 수 있습니다.
샘플 코드:
List<String> list = new ArrayList<>(); Iterator<String> it = list.iterator(); while(it.hasNext()) { String str = it.next(); if(str.equals("hello")) { it.remove(); } }
(3) CopyOnWriteArrayList 사용
CopyOnWriteArrayList는 읽기-쓰기 분리 기능을 통해 컬렉션에 요소를 추가하거나 삭제할 때 현재 스레드에 영향을 주지 않습니다. . 요소가 변경되면 CopyOnWriteArrayList는 데이터의 새 복사본을 만든 다음 해당 복사본에 대해 작업을 수행합니다. 따라서 CopyOnWriteArrayList는 읽기가 많고 쓰기가 적은 시나리오에 적합합니다.
샘플 코드:
List<String> list = new CopyOnWriteArrayList<>(); Iterator<String> it = list.iterator(); while(it.hasNext()) { String str = it.next(); if(str.equals("hello")) { list.remove(str); } }
위는 ConcurrentModificationException 예외를 방지하기 위해 사용하는 일반적인 방법입니다. 실제 프로그래밍에서는 프로그램의 견고성과 효율성을 보장하기 위해 실제 상황에 맞는 방법을 선택해야 합니다.
위 내용은 Java에서 ConcurrentModificationException을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!