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


사용할 수 있습니다 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 ( myTempObjectmyObject) 모두 동일한 객체에 대한 참조를 포함 합니다. 에 포함 된 개체의 새 복사본을 포함하는 새 목록을 실제로 원하는 경우 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.