먼저 코드를 살펴보십시오.
@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
은 플러스가 될 것이지만 ,주기가 시작될 때 두 가지가 동일 하며 결정 방법에 의해 예외가 발생합니다. 경우 있어서 내부 클래스가 되는 요소를 제거하기 위해 사용되는 두 가지 속성은 상기 컬렉션의 정상적인 작동을 보장하기 위해 동일하게 재 할당 될 것이다. 위의 데모를 다음 코드로 변경하여 정상적으로 실행하십시오.remove
modCount
expectedModCount
checkForComodification
ConcurrentModificationException
ArrayList
Itr
remove
@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
합니다.