Java에서 범용 목록을 복제하려면 어떻게 해야 합니까?
나는 가지고 있다.ArrayList<String>
반납하고 싶은 책입니다. ArrayList
에는 다음 시그니처를 가진 클론 방식이 있습니다.
public Object clone()
이 메서드를 호출한 후 반환된 오브젝트를 다시 캐스트하려면 어떻게 해야 합니까?ArrayList<String>
?
복제하려는 이유가 무엇입니까?일반적으로 새 목록을 만드는 것이 더 적합합니다.
List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);
일이 끝났다.
ArrayList newArrayList = (ArrayList) oldArrayList.clone();
이를 위해 사용하는 코드는 다음과 같습니다.
ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);
희망은 너에게 유익하다.
Java 8에서는 스트림으로 복제할 수 있습니다.
import static java.util.stream.Collectors.toList;
...
List<AnObject> clone = myList.stream().collect(toList());
Object.clone()에는 몇 가지 중요한 문제가 있으며 대부분의 경우 사용을 권장하지 않습니다.완전한 답변은 조슈아 블로흐의 "유효한 자바" 항목 11을 참조하십시오.Object.clone()은 프리미티브 타입 어레이에서 안전하게 사용할 수 있다고 생각합니다만, 그것과는 별도로 클론을 올바르게 사용하고 덮어쓰기를 신중하게 할 필요가 있습니다.의미론에 따라 객체를 명시적으로 복제하는 복사 생성자 또는 정적 팩토리 메서드를 정의하는 것이 좋습니다.
Collections API를 사용하면 효과가 있을 것 같습니다.
참고: 복사 방법은 선형 시간으로 실행됩니다.
//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
addAll을 사용하면 문제가 없습니다.
ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);
일반 구문 대신 괄호가 사용됩니다.
목록을 getter로 반환하려면 다음 작업을 수행하는 것이 좋습니다.
ImmutableList.copyOf(list);
List<String> shallowClonedList = new ArrayList<>(listOfStrings);
이것은 단순한 카피일 뿐, 깊이가 없는 카피입니다.새 목록이 표시되지만 엔트리는 동일합니다.이것은 단순한 문자열로는 문제가 되지 않습니다.목록 엔트리가 개체일 경우 더 까다로워집니다.
다음과 같은 범용 인터페이스를 복제하려면java.util.List
캐스팅만 하면 돼요.다음은 예를 제시하겠습니다.
List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());
조금 까다롭지만, 만약 당신이 그것을 반환하는 것에 한정되어 있다면 효과가 있습니다.List
원하는 경우 언제든지 목록을 구현할 수 있습니다.
이 답변이 최종 답변에 가깝다는 것은 알고 있습니다만, 이 답변은 고객님이 작업하고 있는 동안 이 모든 것을 어떻게 해야 하는지에 대한 답변입니다.List
- 범용 부모 - 없음ArrayList
Array Lists를 복제할 때는 매우 주의해야 합니다.Java에서의 클로닝은 얕습니다.즉, 어레이 목록 자체만 복제하고 구성원은 복제하지 않습니다.따라서 ArrayList X1을 사용하여 X2로 클론하는 경우 X2의 변경은 X1에도 나타나며 그 반대도 마찬가지입니다.복제 시 원본의 동일한 요소에 대한 포인터를 가진 새 ArrayList만 생성됩니다.
이것도 동작합니다.
ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()
ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();
Java Professional은 아니지만, 같은 문제가 있어 이 방법으로 해결하려고 했습니다.(T에 copy constructor가 있는 것 같습니다.)
public static <T extends Object> List<T> clone(List<T> list) {
try {
List<T> c = list.getClass().newInstance();
for(T t: list) {
T copy = (T) t.getClass().getDeclaredConstructor(t.getclass()).newInstance(t);
c.add(copy);
}
return c;
} catch(Exception e) {
throw new RuntimeException("List cloning unsupported",e);
}
}
언급URL : https://stackoverflow.com/questions/54909/how-do-i-clone-a-generic-list-in-java
'programing' 카테고리의 다른 글
IntelliJ IDEA에서 응용 프로그램 실행 프로파일의 클래스 경로에 디렉토리를 추가하는 방법 (0) | 2022.08.03 |
---|---|
createElement 렌더 기능을 사용하여 javascript에서 vue.sync를 쓰는 방법 (0) | 2022.08.03 |
외부 URL 열기 (0) | 2022.08.03 |
모키토 사용시verify()? (0) | 2022.08.03 |
Vue Single page app Router, 경로 변경 시 컴포넌트는 어떻게 됩니까? (0) | 2022.08.03 |