[java] 한 ArrayList의 내용을 다른 ArrayList에 어떻게 복사합니까?

일부 데이터 구조가 있는데 하나를 임시로 사용하고 다른 하나를 임시가 아닌 것으로 사용하고 싶습니다.

ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();


//fill myTempObject here
....

//make myObject contain the same values as myTempObject
myObject = myTempObject;

//free up memory by clearing myTempObject
myTempObject.clear();

이제 이것의 문제는 물론을 myObject가리키는 것입니다 . myTempObject그래서 일단 myTempObject지워 지면 myObject.

Java myTempObjectmyObject사용하여 값을 어떻게 유지 합니까?



답변

다음과 같은 트릭을 사용할 수 있습니다.

myObject = new ArrayList<Object>(myTempObject);

또는 사용

myObject = (ArrayList<Object>)myTempObject.clone();

여기에서 clone () 메서드에 대한 정보를 얻을 수 있습니다.

그러나 이러한 모든 방법은 모든 요소가 아닌 List 의 사본을 제공한다는 점을 기억해야 합니다. 따라서 복사 한 목록의 요소 중 하나를 변경하면 원래 목록에서도 변경됩니다.


답변

originalArrayList. addAll (copyArrayList);

참고 : addAll () 메서드를 사용하여 복사 할 때 두 배열 목록 (originalArrayList 및 copyArrayList)의 내용은 동일한 객체 또는 내용을 참조합니다. 따라서 그중 하나를 수정하면 다른 하나도 동일한 변경 사항을 반영합니다.

원하지 않는 경우 for 또는 while 루프를 사용하는 것처럼 originalArrayList의 각 요소를 copyArrayList로 복사해야합니다.


답변

할당 연산자를 통해 Java에서 만든 암시 적 복사본이 없습니다. 변수는 참조 값 (포인터)을 포함하며 사용할 때 =해당 값만 처리합니다.

myTempObject귀하 의 내용을 보존하려면 사본을 만들어야합니다.

ArrayList다른 생성자를 사용하여 새 생성자를 생성하면됩니다 ArrayList.

ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);

편집 : 보헤미안이 아래 댓글에서 지적했듯이 이것이 당신이 요구하는 것입니까? 위의 작업을 수행하면 ArrayLists ( myTempObjectmyObject) 모두 동일한 객체에 대한 참조를 포함 합니다. 에 포함 된 개체의 새 복사본을 포함하는 새 목록을 실제로 원하는 경우 myTempObject원본에있는 각 개별 개체의 복사본을 만들어야합니다.ArrayList


답변

같은 문제에 직면하면서 이것을 발견했습니다.

arraylist1 = arraylist2는 둘 다 같은 위치를 가리 키도록 설정하므로 데이터를 변경하면 두 목록이 항상 동일하게 유지됩니다.

값을 독립적 인 목록으로 복사하기 위해 방금 foreach를 사용하여 내용을 복사했습니다.

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

현재 어떤 방식 으로든 list1을 채우십시오.

foreach(<type> obj in list1)
{
    list2.Add(obj);
}


답변

oldList를 newList라는 새 ArrayList 객체에 복사하려고한다고 가정합니다.

ArrayList<Object> newList = new ArrayList<>() ;

for (int i = 0 ; i<oldList.size();i++){
    newList.add(oldList.get(i)) ;
}

이 두 목록은 확실하지 않으며 하나의 변경 사항이 다른 목록에 반영되지 않습니다.


답변

예를 들어 보겠습니다.

     ArrayList<String> firstArrayList = new ArrayList<>();
            firstArrayList.add("One");
            firstArrayList.add("Two");
            firstArrayList.add("Three");
            firstArrayList.add("Four");
            firstArrayList.add("Five");
            firstArrayList.add("Six");
            //copy array list content into another array list
             ArrayList<String> secondArrayList=new ArrayList<>();
            secondArrayList.addAll(firstArrayList);
            //print all the content of array list
            Iterator itr = secondArrayList.iterator();
            while (itr.hasNext()) {
                System.out.println(itr.next());
            }

아래와 같이 인쇄 출력

하나



다섯
여섯

정확한 복사본을 만드는 데 사용되는 clone () 메서드를 사용하여 수행 할 수도 있습니다.

그 시도를 위해 당신은 같이 시도 할 수 있습니다

 **ArrayList<String>secondArrayList = (ArrayList<String>) firstArrayList.clone();**
    And then print by using iterator
      **Iterator itr = secondArrayList.iterator();
                while (itr.hasNext()) {
                    System.out.println(itr.next());
                }**


답변

clone()개별 개체 가 필요 합니다. Constructor및 다른 방법은 얕은 복사를 수행합니다. Collections.copy 메서드를 사용해 볼 수 있습니다 .