루프 본문에서 콜렉션을 추가 또는 삭제할 때 오류 : java.util.ConcurrentModificationException

먼저 코드를 살펴보십시오.

 @Test
 public void test02(){
    
    
     List<String> list = new ArrayList<>(8);
     list.add("tom");
     list.add("jack");
     list.add("marry");
     list.add("wuwl");
     for(String string:list){
    
    
         if("wuwl".equals(string)){
    
    
             list.remove(string);
         }
     }
 }

위의 코드는 실행 중일 때 확실히 java.util.ConcurrentModificationException예외를 throw 하며 동일한 예외 list.remove(string);로 대체됩니다 list.add("gg"). 소스 코드의 909 행을
여기에 사진 설명 삽입입력하십시오 ArrayList.

final void checkForComodification() {
    
    
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

방법의 사용 ArrayList플러스가 될 것이지만 ,주기가 시작될 때 두 가지가 동일 하며 결정 방법에 의해 예외가 발생합니다. 경우 있어서 내부 클래스가 되는 요소를 제거하기 위해 사용되는 두 가지 속성은 상기 컬렉션의 정상적인 작동을 보장하기 위해 동일하게 재 할당 될 것이다. 위의 데모를 다음 코드로 변경하여 정상적으로 실행하십시오.removemodCountexpectedModCountcheckForComodificationConcurrentModificationException
여기에 사진 설명 삽입ArrayListItrremove
여기에 사진 설명 삽입

@Test
public void test03(){
    
    

    List<String> list = new ArrayList<>(8);
    list.add("tom");
    list.add("jack");
    list.add("marry");
    list.add("wuwl");
    ListIterator<String> iterator = list.listIterator();
    while(iterator.hasNext()){
    
    
        if("wuwl".equals(iterator.next())){
    
    
            iterator.remove();
            iterator.add("gg");
        }
    }
    System.out.println(list);
}

ListIterator<String> iterator = list.listIterator();대체되는 경우 Iterator<String> iterator = list.iterator();다른 remove방법이 있지만 방법 없습니다 add. 두 목록의 메서드는 List인터페이스에 대해 정의되어 있습니다. in ArrayList, iterator()return direct Itr(), listIterator()내부 클래스 ListItr유형을 반환하면 클래스 가 인터페이스를 상속 Itr하고 구현 ListIterator합니다.
여기에 사진 설명 삽입

추천

출처blog.csdn.net/qq_41885819/article/details/107191848