Java | deep copy & shallow copy


Deep Copy & Shallow Copy


Note:
  • Shallow Copyでは、通常、エンコード時によく発生するケースの1つです.浅いレプリケーションではオブジェクトが作成されますが、その内容は既存のオブジェクトを参照します.
  • 既存のオブジェクトが変化すると、参照される他のオブジェクトも変化します.
  • とその同級のDeep Copyでは、別のオブジェクトを作成し、別の参照を作成することを意味します.したがって、Deep Copyの場合は、どの場合も参照されないため、影響を受けません.

  • Sample Example

  • samle code (Shallow Copy)
  • import java.util.ArrayList;
    import java.util.List;
    
    public class MainCopy {
    
        public static void main(String[] args) {
    
            List<String> stringList = new ArrayList<>();
    
            init(stringList);
    
            List<String> strings2 = stringList;
    
            System.out.println("list 1: " + stringList);
    
            System.out.println("list 2: " + strings2);
    
            System.out.println("인덱스 0 값 삭제");
    
            stringList.remove(0);
    
            System.out.println("list 1: " + stringList);
    
            System.out.println("list 2: " + strings2);
    
        }
    
        public static void init(List<String> stringList) {
            for (int i = 0; i < 5; i++) {
                stringList.add("test" + i);
            }
        }
    
    }
  • listに単純な文字列配列値
  • を入れる
  • と別のリストで、最初に作成したリストを参照してみましょう.
  • と最初の音で作成されたリストから、インデックスが0の値を削除します.

  • 結果を見ると、2つのリストの値が消えてしまいます.
  • samle code (Deep Copy)
  • import java.util.ArrayList;
    import java.util.List;
    
    public class MainCopy {
    
        public static void main(String[] args) {
    
            List<String> stringList = new ArrayList<>();
    
            init(stringList);
    
            List<String> strings2 = new ArrayList<>();
    
            strings2.addAll(stringList);
    
            System.out.println("list 1: " + stringList);
    
            System.out.println("list 2: " + strings2);
    
            System.out.println("인덱스 0 값 삭제");
    
            stringList.remove(0);
    
            System.out.println("list 1: " + stringList);
    
            System.out.println("list 2: " + strings2);
    
        }
    
        public static void init(List<String> stringList) {
            for (int i = 0; i < 5; i++) {
                stringList.add("test" + i);
            }
        }
    
    }
  • listに単純な文字列配列値
  • を入れる
  • にはもう一つのリストがあります.두번째 만든 리스트에 addAll 함수로 데이터를 넣어준다.
  • と聞こえます.
  • と最初の音で作成されたリストから、インデックスが0の値を削除します.