JAVA 집합 에서 요 소 를 삭제 할 때의 java. util. ConcurrentModificationException
본 고 는 이런 현상 과 해결 방법 을 간단하게 설명 한다.
아래 코드 와 같이 reove 든 add 든 Concurrent ModificationException 이상 이 발생 합 니 다.
4. 567913. reove 에 대한 해결 방법 은 iterator 를 이용 한 reove 방법 입 니 다.
4. 567913. 집합 이 특정한 조건 을 만족 시 키 는 상황 에서 add 요소 의 해결: 먼저 add 할 요 소 를 다른 집합 에 두 고 판단 이 완 료 된 후에 가입 합 니 다.
4. 567913. 여기 서 재 미 있 는 현상 을 만 났 습 니 다. 아래 코드 는 Concurrent ModificationException 이 발생 하지 않 았 습 니 다. 3 개의 요소 만 있 는 집합 에서 remove 두 번 째 요 소 는 Concurrent ModificationException 이 발생 하지 않 았 고 마지막 집합 에 1 과 3 만 있 었 습 니 다. remove 1 과 3 에 이상 이 있 을 수 있 습 니 다. add 요소 에 도 이상 이 있 습 니 다. 혹시 JDK 의 bug 입 니까?한 마디 로 하면 reove 요 소 를 사용 할 때 iterator 의 reove 방법 을 사용 해 야 합 니 다.
읽 기와 동시에 수정 하려 면 CopyOnWriteArrayList 또는 CopyOnWriteArraySet 을 사용 하 십시오.
public static void testWrongAccess2() {
Collection<String> myCollection = new ArrayList<String>(10);
myCollection.add("1");
myCollection.add("2");
myCollection.add("3");
myCollection.add("4");
Iterator itr = myCollection.iterator();
while (itr.hasNext()) {
String myObject = (String) itr.next();
System.out.println(myObject);
if ("2".equals(myObject)) {
myCollection.remove(myObject); // cause ConcurrentModificationException
//myCollection.add("4"); // cause ConcurrentModificationException
}
}
}
//1.5
for (String myObject: myCollection) {
System.out.println(myObject);
if ("2".equals(myObject)) {
myCollection.remove(myObject);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.