programing

Java에서 범용 목록을 복제하려면 어떻게 해야 합니까?

goodsources 2022. 8. 3. 23:15
반응형

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

반응형