Java의 다른 목록에 목록 복사

1. 개요

이 빠른 자습서에서는 목록 을 다른 목록 으로 복사하는 다양한 방법 과 프로세스에서 발생하는 일반적인 오류를 보여줍니다.

컬렉션 사용에 대한 소개는 여기에서이 도움말을 참조하세요.

2. 생성자

List 를 복사하는 간단한 방법 은 컬렉션을 인수로 사용하는 생성자를 사용하는 것입니다.

List copy = new ArrayList(list);

여기에서 참조를 복사하고 객체를 복제하지 않기 때문에 한 요소의 모든 수정 사항이 두 목록에 모두 영향을 미칩니다.

따라서 생성자를 사용하면 불변 객체를 복사하는 것이 좋습니다.

List copy = new ArrayList(list);

Integer 는 변경 불가능한 클래스이며 인스턴스가 생성 될 때 값이 설정되며 변경할 수 없습니다.

정수 참조하여 여러 목록 및 스레드에 의해 공유 될 수 있으며, 그 값을 변경할 수있는 방법은 아무도 없다.

3. ConcurrentAccessException 나열

목록으로 작업하는 일반적인 문제는 ConcurrentAccessException 입니다. 이것은 복사를 시도하는 동안 목록을 수정하고 있음을 의미 할 수 있습니다. 대부분 다른 스레드에서 가능합니다.

이 문제를 해결하려면 다음 중 하나를 수행해야합니다.

  • 동시 액세스 수집을 위해 설계된 사용
  • 컬렉션을 적절하게 잠 가서 반복합니다.
  • 원본 컬렉션을 복사 할 필요가 없도록하는 방법 찾기

마지막 접근 방식을 고려할 때 스레드로부터 안전하지 않습니다. 따라서 첫 번째 옵션으로 문제를 해결하려면 CopyOnWriteArrayList 를 사용할 수 있습니다 . 여기에서 모든 변형 작업은 기본 배열의 새 복사본을 만들어 구현됩니다.

자세한 내용은이 기사를 참조하십시오.

Collection 을 잠 그려 는 경우 ReentrantReadWriteLock 과 같은 읽기 / 쓰기 액세스를 직렬화하기 위해 잠금 기본 요소를 사용할 수 있습니다 .

4. 모두 추가

요소를 복사하는 또 다른 방법은 addAll 메소드를 사용하는 것입니다.

List copy = new ArrayList(); copy.addAll(list);

이 메서드를 사용할 때마다 생성자와 마찬가지로 두 목록의 내용이 동일한 개체를 참조한다는 점을 기억하는 것이 중요합니다.

5. Collections.copy

컬렉션의 클래스 또는 반환 컬렉션에서 작동 정적 방법으로 독점적으로 구성되어 있습니다.

그중 하나는 copy 이며 소스 목록과 대상 목록이 최소한 소스만큼 길어야합니다.

원본과 같이 대상 목록에서 복사 된 각 요소의 색인을 유지합니다.

List source = Arrays.asList(1,2,3); List dest = Arrays.asList(4,5,6); Collections.copy(dest, source);

위의 예에서는 두 목록의 크기가 같기 때문에 대상 목록 의 이전 요소를 모두 덮어 썼습니다 .

대상 목록 크기가 원본보다 큰 경우 :

List source = Arrays.asList(1, 2, 3); List dest = Arrays.asList(5, 6, 7, 8, 9, 10); Collections.copy(dest, source);

목록의 나머지 요소는 보존되는 동안 세 개의 첫 번째 항목 만 덮어 씁니다.

6. Java 8 사용

이 버전의 Java는 새로운 도구를 추가하여 가능성을 열어줍니다. 다음 예제에서 살펴볼 것은 Stream입니다 .

List copy = list.stream() .collect(Collectors.toList());

이 방법의 주요 장점은 건너 뛰기 및 필터를 사용할 수 있다는 것입니다. 다음 예에서는 첫 번째 요소를 건너 뛸 것입니다.

List copy = list.stream() .skip(1) .collect(Collectors.toList());

String 의 길이를 기준으로 필터링 하거나 객체의 속성을 비교하여 필터링 할 수도 있습니다.

List copy = list.stream() .filter(s -> s.length() > 10) .collect(Collectors.toList());
List flowers = list.stream() .filter(f -> f.getPetals() > 6) .collect(Collectors.toList());

null-safe 방식으로 작업하고 싶을 가능성이 있습니다.

List flowers = Optional.ofNullable(list) .map(List::stream)   .orElseGet(Stream::empty)   .collect(Collectors.toList());

이 방법으로도 요소를 건너 뜁니다.

List flowers = Optional.ofNullable(list)   .map(List::stream).orElseGet(Stream::empty)   .skip(1)   .collect(Collectors.toList());

7. Java 10 사용

마지막으로, 마지막 Java 버전 중 하나를 사용 하여 주어진 Collection 의 요소를 포함 하는 불변 목록 을 만들 수 있습니다 .

List copy = List.copyOf(list);
유일한 조건은 지정된 Collection이 null이 아니어야하고 null 요소를 포함하지 않아야한다는 것입니다.

8. 결론

이 기사에서는 Java 버전 이 다르고 프로세스에서 발생하는 일반적인 오류 를 사용 하여 List 를 다른 List 로 복사하는 다양한 방법을 살펴 보았습니다 . 항상 그렇듯이 코드 샘플은 여기와 여기에서 GitHub에서 찾을 수 있습니다.