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


85

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

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 myTempObject를 myObject사용하여 값을 어떻게 유지 합니까?


사용할 수 있습니다 List.addAll. 그러나 모든 개체를 유지해야하는 경우 임시 목록을 지우는 것이 실제로 많은 메모리를 지우는 것은 아닙니다. 당신은 참조를 지우려고하기 때문에 당신이 그것을 유지하려는 객체에 관해서는.
— Bhesh Gurung 2011

내가 아는 한이 답변은 여전히 ​​유효합니다 : stackoverflow.com/questions/715650/…
— home

2
당신이 정말로 성취하고자하는 것을 해석하는 것은 어렵습니다. 상황을 설명해야합니다.
— Bhesh Gurung 2011

답변:


138

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

myObject = new ArrayList<Object>(myTempObject);

또는 사용

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

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

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


7
Java에서 값으로 할당은 기본 유형 (int, byte, char 등) 및 리터럴 용으로 예약 된 것입니다. Java에서 파생 된 내용을 복사하도록 명시 적으로 지시하지 않는 한 Object항상 참조로 할당됩니다. 그건 그렇고 clone()얕은 사본이며 포함 된 것을 복사하지 Objects않고 참조를 복사 합니다. 심층 복사를하려면 다음을 참조하십시오. stackoverflow.com/questions/64036/…
— PeterT 2011

@PeterT-Java는 값에 의해서만 호출되고 할당됩니다. 기본이 아닌 유형 변수에는 할당되거나 전달되는 참조 값 이 포함 됩니다.
— Brian Roach 2011

제발 왜 안돼요 oldList = newList?
— X09

2
@ X09 oldList = newList는 newList의 참조를 oldList로 복사하고 newList의 모든 변경 사항은 oldList에도 반영됩니다. 그것은 의도 된 행동이 아닙니다.
— 스리 칸스 Karumanaghat

42

originalArrayList. addAll (copyArrayList);

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

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


1
다른 목록에 대한 영향을 막는 방법은 우리가 이것을 처리 할 수있는 다른 방법이 있습니다
— Mahesh


17

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

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

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

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

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


1
이 경우에는 전화로 벌금을 작동합니다 clear()상의 ArrayList myTempObject객체가 therin 포함에 영향을 미치지 않는다. 그가 목록에 포함 된 물체의 새로운 사본을 원했다면 그것은 또 다른 이야기입니다. 그러나 그것은 제가이 질문을 묻는 것으로 해석 한 것이 아닙니다.
— Brian Roach 2011

당신이 옳다고 생각합니다. 나는 질문을 잘못 해석했습니다. 그는 하나를 치우면 다른 하나가 치워 질 까봐 걱정했습니다. 댓글이 삭제되었습니다.
— 보헤미안

@Bohemian-나는 그것이 공정한 코멘트라고 생각하고 그것을 반영하기 위해 내 게시물을 편집했습니다. 나는 그의 질문을 읽을 때 그것이 OP의 의도라고 생각하지 않았습니다.
— Brian Roach 2011

@BrianRoach ArrayList 내에서 ArrayList의 복사본을 가져 오는 방법.
— Arun

8

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

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

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

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

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

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

4

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

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

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

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


4

예를 들어 보겠습니다.

     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());
                }**

3

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


Collections.copy 고장났습니다. 첫째, 요소를 복사하지만 새 목록에서만 참조한다는 오해의 소지가 있습니다. 둘째, 소스 목록보다
— ACV

1

원본 목록의 전체 복사본을 만드는 간단한 방법은 한 목록의 모든 요소를 ​​다른 목록에 추가하는 것입니다.

ArrayList<Object> originalList = new ArrayList<Object>();
ArrayList<Object> duplicateList = new ArrayList<Object>();

for(Object o : originalList) {
    duplicateList.add(o);
}

이제 originalList를 변경하면 duplicateList에 영향을 미치지 않습니다.


0

한 목록을 다른 목록에 복사하려면 Collection.copy (myObject myTempObject)라는 메서드를 사용할 수 있습니다. 이제 이러한 코드 줄을 실행 한 후 myObject의 모든 목록 값을 볼 수 있습니다.


0

한 목록을 두 번째로 복사하는 것은 매우 간단합니다. 다음과 같이 할 수 있습니다.

ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);

0

다음은 한 arrayList에서 다른 arrayList로 모든 개체를 복사하는 해결 방법입니다.

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

myObject.addAll(myTempObject.subList(0, myTempObject.size()));

subList는 데이터 범위가있는 List를 반환하기위한 것입니다. 그래서 당신은 전체 arrayList 또는 그것의 일부를 복사 할 수 있습니다.


0

String 유형의 arraylist가 두 개 있다고 가정합니다. 처럼

ArrayList<String> firstArrayList ;//This array list is not having any data.

ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.

이제 두 번째 배열의 데이터를 다음과 같이 첫 번째 arraylist에 복사해야합니다.

firstArrayList = new ArrayList<>(secondArrayList );

끝난!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.