List<String> list = new ArrayList<String>();
list.add("AAAA");
list.add("BBBB");
list.add("CCCC");
list.add("DDDD");
list.add("EEEE");
list.add("FFFF");
list.add("GGGG");
for(String value : list) {
  if(value.startsWith("D")) {
    list.remove(value);
  }
}
System.out.println("Result: " + list);
위와 같은 소스코드가 있다고 가정을 해보겠습니다. 위의 코드는 단순히 리스트 전체를 순환중에 값이 D로 시작하는 경우 그 객체(현재 순환중인 자기자신)를 삭제하고자 하는 의도를 가지고 있는 코드입니다.
하지만 위의 코드는 다음과 같은 오류를 만나게 됩니다.
Exception in thread "main" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(Unknown Source) at java.util.AbstractList$Itr.next(Unknown Source) at RemoveInLoop.main(RemoveInLoop.java:20)
기본적으로 리스트는 순환중에 리스트의 추가, 삭제, 변경등 자기 자신을 수정할 수 없게 되어있습니다. 하지만 다음과 같이 Iterator를 활용하면 가능합니다.
List<String> list = new ArrayList<String>();
list.add("AAAA");
list.add("BBBB");
list.add("CCCC");
list.add("DDDD");
list.add("EEEE");
list.add("FFFF");
list.add("GGGG");
for(Iterator<String> it = list.iterator() ; it.hasNext() ; ) {
  String value = it.next();
  if(value.startsWith("C")) {
    it.remove();
  }
}
System.out.println("Result: " + list);
이번에는 C로 시작하는 값을 지워보려는 목적으로 가지고 실행을 해보았습니다. 오류 없이 다음과 같은 결과를 보여줍니다.
Result: [AAAA, BBBB, DDDD, EEEE, FFFF, GGGG]