Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Deep Copy และ Shallow Copy ใน Java


ทั้งสำเนาลึกและสำเนาตื้นหมายถึงการสร้างสำเนาของวัตถุที่ให้ในรูปแบบต่างๆ -

สำเนาตื้น

โดยทั่วไปสิ่งนี้จะสร้างอินสแตนซ์ใหม่ของวัตถุและคัดลอกข้อมูลทั้งหมดจากชุดข้อมูลดั้งเดิมไปยังอินสแตนซ์ที่สร้างขึ้นใหม่ ซึ่งหมายความว่าจะต้องส่งอินสแตนซ์ที่สร้างขึ้นใหม่ไปยังวัตถุดั้งเดิมโดยเฉพาะ เรียกอีกอย่างว่า 'การโคลนตื้น'

ตัวอย่าง

import java.util.* ;
class Demo{
   private int[] my_data;
   public Demo(int[] my_vals){
      my_data = my_vals;
   }
   public void display_data(){
      System.out.println(Arrays.toString(my_data) );
   }
}
public class Use_Demo{
   public static void main(String[] args){
      int[] my_vals = {56, 89, 91};
      Demo my_inst = new Demo(my_vals);
      my_inst.display_data();
      my_vals[0] = 65;
      my_inst.display_data();
   }
}

ผลลัพธ์

[56, 89, 91]
[65, 89, 91]

คลาสชื่อ Demo ประกอบด้วยตัวแปรและตัวสร้างที่คัดลอกองค์ประกอบของอาร์เรย์ไปยังอาร์เรย์ใหม่ ฟังก์ชันอื่นชื่อ 'display_data' จะแสดงอาร์เรย์ของข้อมูลนี้ ในฟังก์ชันหลัก มีการสร้างอินสแตนซ์ อาร์เรย์ถูกกำหนด และฟังก์ชันถูกเรียก เอาต์พุตที่เกี่ยวข้องจะแสดงบนคอนโซลโดยมีการเปลี่ยนแปลงทั้งหมดที่สะท้อนอยู่ในคอนโซล

สำเนาลึก

ใช้เมื่อต้องการสำเนาข้อมูลแยกต่างหากเพื่อวัตถุประสงค์หรือการใช้งานที่แตกต่างกัน สมาชิกทุกคนในคลาสต้องใช้อินเทอร์เฟซ 'Cloneable' และแทนที่เมธอด 'clone'

ตัวอย่าง

import java.util.*;
class Demo{
   private int[] my_data;
   public Demo(int[] my_vals){
      my_data = new int[my_vals.length];
      for (int i = 0; i < my_data.length; i++){
         my_data[i] = my_vals[i];
      }
   }
   public void display_data(){
      System.out.println(Arrays.toString(my_data));
   }
}
public class Use_Demo{
   public static void main(String[] args){
      int[] my_vals = {56, 89, 91};
      Demo my_inst = new Demo(my_vals);
      my_inst.display_data();
      my_vals[0] = 65;
      my_inst.display_data();
   }
}

ผลลัพธ์

[56, 89, 91]
[56, 89, 91]

คลาสชื่อ Demo ประกอบด้วยตัวแปร และตัวสร้างที่วนซ้ำผ่านอาร์เรย์ และคัดลอกไปยังอาร์เรย์อื่น ฟังก์ชันอื่นชื่อ 'display_data' จะแสดงอาร์เรย์ของข้อมูลนี้ ในฟังก์ชันหลัก อินสแตนซ์จะถูกสร้างขึ้น อาร์เรย์ถูกกำหนด และฟังก์ชันถูกเรียก ผลลัพธ์ที่เกี่ยวข้องจะแสดงบนคอนโซลพร้อมการเปลี่ยนแปลงทั้งหมดที่สะท้อนอยู่ในคอนโซล