나는이 List<SomeBean>
웹 서비스에서 채워집니다. 해당 목록의 내용을 동일한 유형의 빈 목록으로 복사 / 복제하고 싶습니다. 목록 복사를위한 Google 검색에서 Collections.copy()
방법 을 사용하도록 제안했습니다 . 내가 본 모든 예제에서 대상 목록에는 복사를 수행 할 정확한 항목 수가 포함되어 있어야합니다.
사용중인 목록이 웹 서비스를 통해 채워지고 수백 개의 객체가 포함되어 있으므로 위의 기술을 사용할 수 없습니다. 아니면 잘못 사용하고 있습니까 ?? !! 어쨌든, 그것을 작동시키기 위해, 나는 이와 같은 것을 시도했지만 여전히 IndexOutOfBoundsException
.
List<SomeBean> wsList = app.allInOne(template);
List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList.size());
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());
사용하려고했지만 나중에 코드에서 wsListCopy=wsList.subList(0, wsList.size())
얻었습니다 ConcurrentAccessException
. 명중과 재판. 🙂
어쨌든 내 질문은 간단 합니다. 목록의 전체 내용을 다른 목록에 어떻게 복사 할 수 있습니까? 물론 반복하지 않습니다.
답변
이것을 사용하십시오 :
List<SomeBean> newList = new ArrayList<SomeBean>(otherList);
참고 : 수정하면 여전히 스레드로부터 안전하지 otherList
다른 스레드에서, 당신은 확인 할 수 있습니다 otherList
(심지어 및 newList
A) CopyOnWriteArrayList
– 나 같은 프리미티브 잠금을 사용, 예를 들어 ReentrantReadWriteLock 어떤 목록입니다 읽기 직렬화 / 쓰기 액세스를 동시에 액세스.
답변
이것은 정말 좋은 Java 8 방법입니다.
List<String> list2 = list1.stream().collect(Collectors.toList());
물론 여기서 이점은 목록의 일부만 필터링하고 건너 뛸 수 있다는 것입니다.
예 :
//don't copy the first element
List<String> list2 = list1.stream().skip(1).collect(Collectors.toList());
답변
originalArrayList.addAll(copyArrayofList);
addAll () 메서드를 복사에 사용할 때마다 동일한 객체에 대한 두 배열 목록 (originalArrayList 및 copyArrayofList) 참조의 내용이 목록에 추가되므로이 중 하나를 수정하면 copyArrayofList도 같은 변화를 반영하십시오.
부작용을 원하지 않으면 for 또는 while 루프를 사용하는 것처럼 originalArrayList의 각 요소를 copyArrayofList로 복사해야합니다.
답변
나는 이와 같은 것을 시도했지만 여전히 IndexOutOfBoundsException을 얻었습니다.
ConcurrentAccessException이 발생했습니다
이것은 다른 스레드에서 복사하려고 시도하는 동안 목록을 수정하고 있음을 의미합니다. 이 문제를 해결하려면 다음 중 하나를 수행해야합니다.
-
동시 액세스 용으로 설계된 모음을 사용하십시오.
-
컬렉션을 적절히 잠그면 반복 할 수 있습니다 (또는이를 수행하는 메서드를 호출하도록 허용)
-
원본 목록을 복사하지 않아도되는 거리를 찾으십시오.
답변
Java 10 에서 시작 :
List<E> oldList = List.of();
List<E> newList = List.copyOf(oldList);
List.copyOf()
List
주어진의 요소를 포함 하는 수정 불가능한 것을 리턴합니다 Collection
.
주어진 Collection
은이어야하며 요소를 null
포함해서는 안됩니다 null
.
또한의 깊은 사본을 만들려면 여기에서List
많은 좋은 답변을 찾을 수 있습니다 .
답변
null 안전 방식으로 Java 8을 사용하는 또 다른 방법이 있습니다.
List<SomeBean> wsListCopy = Optional.ofNullable(wsList)
.map(Collection::stream)
.orElseGet(Stream::empty)
.collect(Collectors.toList());
한 요소를 건너 뛰려면
List<SomeBean> wsListCopy = Optional.ofNullable(wsList)
.map(Collection::stream)
.orElseGet(Stream::empty)
.skip(1)
.collect(Collectors.toList());
Java 9+에서는 Optional의 스트림 방법을 사용할 수 있습니다
Optional.ofNullable(wsList)
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList())
답변
나는 ConcurrentAccessException 과 같은 문제가 있었고 내 해결책은 다음과 같습니다.
List<SomeBean> tempList = new ArrayList<>();
for (CartItem item : prodList) {
tempList.add(item);
}
prodList.clear();
prodList = new ArrayList<>(tempList);
따라서 한 번에 하나의 작업 만 작동하고 예외를 피합니다 …