>Java >java지도 시간 >Java에서 반복하는 동안 컬렉션을 안전하게 수정하려면 어떻게 해야 합니까?

Java에서 반복하는 동안 컬렉션을 안전하게 수정하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-09 22:45:15816검색

How Can I Safely Modify Collections While Iterating in Java?

반복 중 컬렉션 수정: 종합 가이드

ConcurrentModificationException과 같은 오류를 방지하기 위해 반복 중에 컬렉션을 효과적으로 수정하려면 고려해야 할 몇 가지 전략이 있습니다. :

수집하고 제거

이 방법에는 향상된 for 루프 중에 제거할 객체를 수집한 다음 반복이 완료된 후 제거하는 방법이 포함됩니다. 이 기술은 삭제가 주요 목표인 시나리오에서 특히 유용합니다.

List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
List<Book> found = new ArrayList<>();

for (Book book : books) {
    if (book.getIsbn().equals(isbn)) {
        found.add(book);
    }
}

books.removeAll(found);

ListIterator 사용

ListIterator는 반복 중에 항목 제거 및 추가를 모두 지원합니다. 이는 목록을 수정할 때 적합한 선택입니다.

List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
ListIterator<Book> iter = books.listIterator();

while (iter.hasNext()) {
    if (iter.next().getIsbn().equals(isbn)) {
        iter.remove();
    }
}

JDK >= 8

Java 8에서는 컬렉션 수정을 위한 추가 방법을 도입합니다.

  • removeIf: 이 메소드는 지정된 요소와 일치하는 요소를 제거합니다. 컬렉션의 조건자:
List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
books.removeIf(book -> book.getIsbn().equals(isbn));
  • 스트림 API: 스트림 API를 사용하면 파이프라인을 사용하여 요소를 필터링하고 제거할 수 있습니다.
List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
List<Book> filtered = books.stream()
                           .filter(book -> book.getIsbn().equals(isbn))
                           .collect(Collectors.toList());

하위 목록 또는 하위 집합

정렬된 목록의 경우 하위 목록을 사용하여 연속 요소를 효율적으로 제거할 수 있습니다.

List<Book> books = new ArrayList<>();
books.subList(0, 5).clear();

고려 사항

수정 선택 방법은 특정 시나리오 및 컬렉션 유형에 따라 다릅니다. 다음은 몇 가지 주요 고려 사항입니다.

  • "수집 및 제거" 기술은 다목적이며 모든 컬렉션에서 작동합니다.
  • ListIterator 접근 방식은 효율적이지만 지원 구현이 있는 목록에만 적용할 수 있습니다.
  • Iterator 접근 방식은 제거를 지원하지만 보편적으로 사용 가능하지 않을 수 있습니다.
  • JDK 8 메서드는 효율적인 필터링을 제공합니다. 제거할 수 있지만 새 컬렉션으로 옮겨야 합니다.
  • 하위 목록을 사용하면 정렬된 목록에서 연속된 요소를 대량으로 제거할 수 있습니다.

위 내용은 Java에서 반복하는 동안 컬렉션을 안전하게 수정하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.