java.util 복사 방법다른 java.util에 나열합니다.목록.
는 나나 a a a가 있다List<SomeBean>웹 서비스로부터 입력됩니다.해당 목록의 내용을 같은 유형의 빈 목록으로 복사/복제하고 싶습니다.에서 구글을 사용할 했습니다.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예를 들어 -- 또는 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() 메서드를 사용할 때는 항상 동일한 오브젝트에 대한 어레이 목록(original Array List 및 copy Arrayof List)의 내용이 목록에 추가되므로 둘 중 하나를 수정하면 copy Array of List도 동일한 변경을 반영합니다.
부작용을 원하지 않는 경우 for 또는 while 루프를 사용하는 경우와 같이 originalArrayList에서 copyArrayofList로 각 요소를 복사해야 합니다.딥 카피의 경우는, 이하의 코드 스니펫을 사용할 수 있습니다.
가지 더 할 , ''을 하고, '실행해 주세요.Cloneable 및 "interface"를 .clone()SomeBean 래 some some some some some some some 。
public static List<SomeBean> cloneList(List<SomeBean> originalArrayList) {
List<SomeBean> copyArrayofList = new ArrayList<SomeBean>(list.size());
for (SomeBean item : list) copyArrayofList.add(item.clone());
return clone;
}
이와 같은 작업을 수행하려고 했지만 IndexOutOfBoundsException이 여전히 수신되었습니다.
동시접속 가능예외.
이는 목록을 복사하는 동안 다른 스레드에서 수정하는 것을 의미합니다.이 문제를 해결하려면
동시 액세스용으로 설계된 컬렉션을 사용합니다.
컬렉션을 반복할 수 있도록 컬렉션을 적절히 잠급니다(또는 이 작업을 수행하는 메서드를 호출할 수 있습니다).
원본 목록을 복사할 필요가 없도록 멀리 떨어진 곳을 찾습니다.
Java 10부터:
List<E> oldList = List.of();
List<E> newList = List.copyOf(oldList);
List.copyOf() 변경할 수 없는 것을 반환List 요소 Collection.
의 「」Collection null 도 들어 있지 합니다.null★★★★★★★★★★★★★★★★★★.
「」의딥는, 「」를 참조해 주세요.List, 당신은 여기에서 많은 좋은 답을 찾을 수 있습니다.
Java 8을 null-safe 방식으로 사용하는 다른 방법이 있습니다.
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())
Concurrent Access에서도 같은 문제가 발생하였습니다.예외 및 mysolution은 다음과 같습니다.
List<SomeBean> tempList = new ArrayList<>();
for (CartItem item : prodList) {
tempList.add(item);
}
prodList.clear();
prodList = new ArrayList<>(tempList);
따라서 한 번에 1개의 작업만 수행되며 Exception을 피할 수 있습니다.
같은 방법으로 문제를 재현할 수 있었습니다(Index Out Of Bounds Exception).다음은 저의 조사 결과입니다.
1) Collections.copy(destList, sourceList) 구현에서는 먼저 size() 메서드를 호출하여 수신인 목록의 크기를 확인합니다.size() 메서드에 대한 호출은 항상 목록 내의 요소 수(이 경우 0)를 반환하므로 컨스트럭터 ArrayList(capacity)는 백업 배열의 초기 용량만 보증하며 목록 크기와는 관계가 없습니다.따라서 IndexOutOfBoundsException은 항상 수신됩니다.
2) 비교적 간단한 방법은 컬렉션을 인수하는 컨스트럭터를 인수로 사용하는 것입니다.
List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList);
addAll()을 사용할 수 있습니다.
예:wsListCopy.addAll(wsList);
"예":indexOutOfBoundsException아르그1사이즈제로 베이스이므로 목록의 마지막 요소는 항상 size-1이며 크기 위치에 요소가 없기 때문에 오류가 발생합니다.
정답이 안 보여요.상세 복사를 원할 경우 객체를 수동으로 반복 및 복사해야 합니다(복사 생성자를 사용할 수도 있습니다).
하다를 돼요.addAll의 모든 복사 합니다.지정된 컬렉션의 모든 요소를 복사 목록 끝에 추가합니다.당신의 명단이 복사될 것입니다.
List<String> myList = new ArrayList<>();
myList.add("a");
myList.add("b");
List<String> copyList = new ArrayList<>();
copyList.addAll(myList);
Lombok을 사용하는 경우:
다음 주석을 사용하여 SomeBean을 표시합니다.
@Builder(toBuilder = true, builderMethodName = "")
Lombok은 copy constructor를 사용하여 오브젝트의 얕은 복사를 수행합니다.
inputList.stream()
.map(x -> x.toBuilder().build())
.collect(Collectors.toList());
subList 함수는 트릭이며 반환된 객체는 원래 목록에 남아 있습니다.따라서 subList에서 작업을 수행하면 단일 스레드 또는 다중 스레드에 관계없이 코드에서 동시 예외가 발생합니다.
언급URL : https://stackoverflow.com/questions/14319732/how-to-copy-a-java-util-list-into-another-java-util-list
'source' 카테고리의 다른 글
| Java에서 문자열을 InputStream으로 변환하려면 어떻게 해야 하나요? (0) | 2022.08.24 |
|---|---|
| 페이지피드 통찰력이 "blob" 압축 및 캐시를 수정하도록 요구하는 이유는 무엇입니까? (0) | 2022.08.24 |
| 'forward declaration'은 무엇이며 'typeef structure X'와 'structure X'의 차이점은 무엇입니까? (0) | 2022.08.24 |
| 이미 초기화된 Sentry.io 설정에 Vue.js 통합을 추가하려면 어떻게 해야 합니까? (0) | 2022.08.21 |
| 자바 사용법Scala의 String.format? (0) | 2022.08.21 |