Java Iterator remove() 메서드
Java 개발자는 반복하는 동안 종종 ArrayList
에서 요소 또는 객체를 제거해야 합니다.
여기에서 문제는 ConcurrentModificationException
을 발생시키면서 반복하면서 원래 컬렉션에서 개체를 제거하려고 할 때 발생합니다. 이 기사에서는 Iterator
의 remove()
메서드와 Collection
의 remove()
메서드가 어떻게 다르게 작동하는지 알아봅니다.
Collection
의 remove()
메서드 소개
Java에서 Collection
은 ArrayList
, Set
등과 같은 다양한 데이터 유형을 포함하는 인터페이스입니다. Collection
에서 요소를 제거하려면 컬렉션을 가져와 remove()
메서드를 사용할 수 있습니다. 참조로.
사용자는 컬렉션과 함께 remove()
메서드를 사용하기 위해 아래 구문을 따를 수 있습니다.
collection.remove(Ind);
Ind
- remove()
메서드는 참조된 컬렉션
의 Ind
인덱스에서 요소를 제거합니다.
수집
의 제거()
메서드 사용
아래 예제에서는 collection
의 remove()
메소드를 사용하여 컬렉션을 생성하고 2번째 및 4번째 인덱스에서 요소를 제거했습니다.
import java.util.ArrayList;
class Test {
public static void main(String[] args) {
// Create an ArrayList
ArrayList<String> testList = new ArrayList<String>();
// Add elements in the ArrayList
testList.add("Apple");
testList.add("Banana");
testList.add("Cat");
testList.add("Dog");
testList.add("Fox");
testList.add("Cow");
// Removing the element at index 2 and 4
System.out.println(testList.remove(2) + " removed\n");
System.out.println(testList.remove(4) + " removed");
}
}
출력:
Cat removed
Cow removed
위 출력에서 사용자는 두 번째 인덱스에서 cat
을 제거하면 ArrayList
의 모든 요소가 하나의 인덱스만큼 이동하는 것을 볼 수 있습니다.
2번째 인덱스에서 요소를 제거한 후 4번째 인덱스에서 해당 요소를 제거하려고 하면 remove()
메소드가 실제 ArrayList
의 5번째 인덱스에서 요소를 제거하므로 2번째 인덱스 이후의 모든 요소가 1로 남았습니다.
Collection
의 remove()
메서드가 정상적으로 작동하는 방식을 배웠습니다.
Iterator
의 remove()
메서드 소개
이제 문제는 Iterator
와 Collection
의 remove()
메소드가 Collection
에서 요소를 제거하므로 차이점이 무엇입니까?
아래 코드를 사용하여 문제를 이해해 봅시다.
import java.util.ArrayList;
class Test {
public static void main(String[] args) {
// Create an ArrayList
ArrayList<String> testList = new ArrayList<String>();
// Add elements in the ArrayList
testList.add("Apple");
testList.add("Banana");
testList.add("Cat");
testList.add("Dog");
testList.add("Fox");
testList.add("Cow");
for (String element : testList) {
if (element.equals("Cat")) {
testList.remove(element);
}
}
}
}
위의 예에서는 다른 문자열의 ArrayList
를 만들었습니다. for
루프를 사용하여 ArrayList
를 반복하고 요소가 cat
과 같은지 확인하고 collection.remove()
메서드를 사용하여 제거하려고 시도합니다.
출력에서 사용자는 원래 목록을 반복하면서 수정할 때 ConcurrentModificationException
예외를 throw하는 것을 볼 수 있습니다.
출력:
Exception in thread "main" java.util.ConcurrentModificationException
문제를 해결하기 위해 iterator
를 사용하여 ArrayList
를 반복하고 Iterator
의 remove()
메서드를 사용하여 요소를 제거할 수 있습니다.
Iterator
의 remove()
메서드 사용
아래 예에서는 문자열의 ArrayList
에 대한 반복자 이름 itr
을 만들었습니다. for
루프와 itr
을 사용하여 ArrayList
를 반복합니다.
또한 반복하는 동안 ArrayList
에서 Fox
요소를 제거합니다.
import java.util.ArrayList;
import java.util.Iterator;
class Test {
public static void main(String[] args) {
// Create an ArrayList
ArrayList<String> testList = new ArrayList<String>();
// Add elements in the ArrayList
testList.add("Apple");
testList.add("Banana");
testList.add("Cat");
testList.add("Dog");
testList.add("Fox");
testList.add("Cow");
// Removing the "Fox" while iterating through the `testList`
Iterator<String> itr = testList.iterator();
while (itr.hasNext()) {
String element = itr.next();
if (element.equals("Fox")) {
testList.remove(element);
}
}
System.out.println(testList);
}
}
출력:
[Apple, Banana, Cat, Dog, Cow]
위 출력에서 ArrayList
를 반복하는 동안 Fox
가 제거되는 것을 관찰할 수 있습니다.
Iterator
의 remove()
메서드 코드 이해
Java의 공식 문서에서 iterator
의 remove()
메서드에 대한 아래 의사 코드를 가져왔습니다. 사용자는 ArrayList
의 remove()
메서드도 사용하지만 ConcurrentModificationException
예외를 throw하지 않는 expectedModCount
를 업데이트한다는 것을 알 수 있습니다.
ArrayList
를 반복할 때 항상 다음 요소를 알아야 합니다. 따라서 remove()
메서드를 사용하여 원래 목록을 수정하려고 하면 다음 인덱스를 업데이트하지 않고 오류가 발생하며 그 문제는 iterator
의 remove()
메서드에서 극복됩니다.
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
또한 사용자는 목록을 복제하고 새 목록을 반복할 수 있습니다. 새 목록을 반복하면서 원래 목록에서 요소를 제거할 수 있습니다.