Map 객체의 얕은 복사본과 깊은 복사

2634 단어 Java 기반
질문: 맵을 복사할 때 데이터가 바뀔 수 있습니다.먼저 보기:
public class CopyMap {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put( "key1", 1);
        Map mapFirst = map;
        System. out.println( mapFirst);
        map.put( "key2", 2);
        System. out.println( mapFirst);
    }
}

위 프로그램의 예상 출력 값은 mapFrist의 값이 모두 1이지만 실제 출력 결과는 다음과 같습니다.
{key1=1}
{key2=2, key1=1}

이것은 맵에 얕은 복사가 발생했기 때문입니다. 맵First는 맵의 인용을 복제했을 뿐입니다. 맵과 같은 메모리 영역을 사용하기 때문에 맵을 수정할 때 맵First의 값도 변할 수 있습니다.
PS:
이른바 얕은 복제란 대상만 복제하는 인용이고 두 인용은 여전히 같은 대상을 가리키며 메모리에서 같은 메모리를 차지한다.복사된 대상의 모든 변수는 원래의 대상과 같은 값을 함유하고 있으며, 모든 다른 대상에 대한 인용은 여전히 원래의 대상을 가리킨다.다시 말하면 얕은 복제는 고려된 대상만 복제하고 인용된 대상은 복제하지 않는다는 것이다.
심복제: 복제된 대상의 모든 변수는 원래의 대상과 같은 값을 포함하고 다른 대상을 인용하는 변수를 제외한다.다른 대상을 인용하는 변수는 복사된 새로운 대상을 가리키며, 더 이상 원래 인용된 대상이 아니다.다시 말하면 복제할 대상이 인용한 대상을 깊이 복제한 것이다.
어떻게 해결합니까?깊이 있는 복사를 사용하여 전체 대상을 복사합니다. 인용 맵 중의 하나인putAll 방법이라고 하는데, 깊이 복사를 실현할 수 있습니다. 다음과 같습니다.
public class CopyMap {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put( "key1", 1);
        Map mapFirst = new HashMap();
        mapFirst.putAll(map); // 
        System. out.println(mapFirst);
        map.put( "key2", 2);
        System. out.println(mapFirst);
    }
}

위와 같이 출력 결과는 다음과 같습니다.
{key1=1}
{key1=1}

좋은 웹페이지 즐겨찾기