문제

나는 가지고있다 ArrayList<String> 내가 사본을 돌려주고 싶은 것. ArrayList 다음 서명이 있는 복제 메소드가 있습니다.

public Object clone()

이 메서드를 호출한 후 반환된 개체를 다시 캐스팅하려면 어떻게 해야 합니까? ArrayList<String>?

도움이 되었습니까?

해결책

ArrayList newArrayList = (ArrayList) oldArrayList.clone();

다른 팁

왜 복제를 하려고 합니까?일반적으로 새 목록을 만드는 것이 더 합리적입니다.

List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);

작업이 완료되었습니다.

이것이 내가 사용하는 코드입니다:

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을 참조하십시오.효과적인 자바"에 대한 완전한 답변은 Joshua Bloch가 작성했습니다.저는 기본 유형 배열에서 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);

다음과 같은 일반 인터페이스를 복제하려면 java.util.List 그냥 캐스팅하면 됩니다.여기 예가 있습니다:

List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());

약간 까다롭지만 반환이 제한된 경우에는 작동합니다. List 인터페이스를 통해 누구든지 원할 때마다 목록을 구현할 수 있습니다.

이 답변이 최종 답변에 가깝다는 것을 알고 있지만 제 답변은 작업하는 동안 이 모든 작업을 수행하는 방법에 대한 답변입니다. List -일반 부모- 아님 ArrayList

ArrayList를 복제할 때는 매우 주의하십시오.Java에서의 복제는 얕습니다.이는 Arraylist 자체만 복제하고 해당 구성원은 복제하지 않음을 의미합니다.따라서 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 ();

저는 자바 전문가는 아니지만 같은 문제가 있어서 이 방법으로 해결해 보았습니다.(T에 복사 생성자가 있다고 가정합니다).

 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);
      }
}
List<String> shallowClonedList = new ArrayList<>(listOfStrings);

이는 깊은 복사본이 아닌 얕은 복사본이라는 점을 명심하세요.새 목록이 표시되지만 항목은 동일합니다.단순한 문자열에는 문제가 되지 않습니다.목록 항목이 개체 자체인 경우에는 더 까다로워집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top