2017-12-18 31 views
3

Java 컨테이너의 복사본 생성자가 단순 복사 또는 딥 복사인지 오랫동안 혼란스러워 했습니까? 다음은 제 이해입니다. ints1, ints2, ints3은 참조이므로 스택에 있습니다. inst1은 힙의 일부 객체를 가리키며이 객체는 스택에있는 3 개의 익명 참조를 보유하며 int 값이 0, 1, 2 인 객체를 가리 킵니다.Java의 ArrayList의 복사 생성자가 단순 복사입니까, 아니면 딥 복사입니까?

ints2 = ints1 

그래서 ints2는 ints1과 동일한 개체를 가리 킵니다. 따라서 ints2에서 refenences가 가리키는 변경 객체는 ints2의 객체에 영향을줍니다.

ints2.set(1,0+10) 

은 refsence ints1.get (0)의 개체를 변경합니다.

ints3 = new ArrayList<>(ints1) 

다음은 제 혼란입니다.

복사 생성자가 얕은 복사 인 경우 ints1과 ints3이 다른 객체를 가리키고 있지만 두 객체는 ​​동일한 참조를가집니다! 따라서 ints1에서 참조를 조작하여 객체를 변경하는 모든 액션은 ints3을 변경합니다. 이는 동일한 객체를 가리키고 있기 때문입니다.

복사 생성자가 딥 복사 인 경우 ints1과 ints3은 다른 참조를 보유하고 다른 개체를 가리 킵니다. 그러면 ints1의 변경 사항은 ints3의 변경 사항에 영향을 미치지 않습니다.

결과에 따르면 복사 생성자가 단순 복사가 아닌 전체 복사 인 것으로 보입니다.

누군가 나를 고칠 수 있기를 바랍니다. 감사합니다.

import java.util.*; 
public class MyClass { 
    public static void main(String args[]) { 
     List<Integer> ints1 = new ArrayList<>(Arrays.asList(0,1,2)); 
     System.out.println(ints1); 
     List<Integer> ints2 = ints1; 
     ints2.set(0,0+10); 
     System.out.println(ints1); 
     List<Integer> ints3 = new ArrayList<>(ints1); 
     ints3.set(1,1+10); 
     System.out.println(ints1); 
    } 
} 
result 
[0, 1, 2] 
[10, 1, 2] 
[10, 1, 2] 
+2

Integer가 얕은 대용량 복사본과 혼동하지 마십시오. 이것을 읽으십시오 : https://yunmingzhang.wordpress.com/2014/01/08/making-shallow-copies-for-java-arraylist-collections-objects/ – Jason

+1

ints1과 ints2는 ints3이 ints1의 값을 사용하여 작성된 별도의 오브젝트. 따라서 ints2의 모든 변경 사항은 ints1을 변경합니다. 하지만 ints3의 변경 사항은 다른 두 객체에는 영향을 미치지 않습니다. 혼란이 있다면 모든 객체의 해시 코드를 인쇄 해보십시오. 차이점을 볼 수 있습니다. –

답변