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]
Integer가 얕은 대용량 복사본과 혼동하지 마십시오. 이것을 읽으십시오 : https://yunmingzhang.wordpress.com/2014/01/08/making-shallow-copies-for-java-arraylist-collections-objects/ – Jason
ints1과 ints2는 ints3이 ints1의 값을 사용하여 작성된 별도의 오브젝트. 따라서 ints2의 모든 변경 사항은 ints1을 변경합니다. 하지만 ints3의 변경 사항은 다른 두 객체에는 영향을 미치지 않습니다. 혼란이 있다면 모든 객체의 해시 코드를 인쇄 해보십시오. 차이점을 볼 수 있습니다. –