IT story

Java ArrayList 사본

hot-time 2020. 5. 11. 08:06
반응형

Java ArrayList 사본


나는이 ArrayList l1크기 10. I 어사 l1새 목록 참조 유형을 l2. l1l2같은 가리킨 ArrayList객체? 또는 ArrayList객체 의 사본이에 할당되어 l2있습니까?

l2참조를 사용할 때 목록 객체를 업데이트하면 l1참조 유형 의 변경 사항도 반영 됩니다.

예를 들면 다음과 같습니다.

List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
    l1.add(i);
}

List l2 = l1;
l2.clear();

두 개의 목록 객체를 생성하고 컬렉션에서 오래된 것에서 새로운 것으로 복사하는 것을 제외하고 새로운 참조 변수에 목록 객체의 사본을 할당하는 다른 방법이 있습니까?


예, 할당은 (참조 인) 을에 복사합니다 . 둘 다 동일한 객체를 참조합니다.l1l2

얕은 사본을 만드는 것은 매우 쉽습니다.

List<Integer> newList = new ArrayList<>(oldList);

(한 가지 예일뿐입니다.)


사용하려고 Collections.copy(destination, source);


l1, l2동일한 참조, 동일한 객체를 가리 킵니다.

다른 ArrayList를 기반으로 새 ArrayList를 작성하려면 다음을 수행하십시오.

List<String> l1 = new ArrayList<String>();
l1.add("Hello");
l1.add("World");
List<String> l2 = new ArrayList<String>(l1); //A new arrayList.
l2.add("Everybody");

결과에는 l1여전히 2 개의 요소가 있고 l23 개의 요소가 있습니다.


src ArrayList에서 dest Arraylist로 값을 복사하는 또 다른 편리한 방법은 다음과 같습니다.

ArrayList<String> src = new ArrayList<String>();
src.add("test string1");
src.add("test string2");
ArrayList<String> dest= new ArrayList<String>();
dest.addAll(src);

이것은 단지 참조의 복사가 아니라 실제 값의 복사입니다.


하나의 ArrayList를 다른 ArrayList로 복사하는 목적으로 사용되는 addAll () 메소드가 있습니다 .

예를 들어 sourceListtargetList의 두 가지 Array List가 있습니다. 아래 코드를 사용하십시오.

targetList.addAll (sourceList);


Java는 객체를 전달하지 않고 참조 (포인터)를 객체에 전달합니다. 예, l2와 l1은 같은 객체에 대한 두 개의 포인터입니다.

동일한 내용을 가진 두 개의 다른 목록이 필요한 경우 명시적인 사본을 만들어야합니다.

참고 URL : https://stackoverflow.com/questions/6536094/java-arraylist-copy

반응형