Pertanyaan Apa perbedaan antara salinan yang dalam dan salinan yang dangkal?


Apa perbedaan antara salinan yang dalam dan salinan yang dangkal?


755
2017-10-08 20:22


asal


Jawaban:


Salinan dangkal duplikat sesedikit mungkin. Salinan koleksi yang dangkal adalah salinan dari struktur koleksi, bukan elemen. Dengan salinan yang dangkal, dua koleksi sekarang berbagi elemen individual.

Salinan dalam menggandakan semuanya. Salinan koleksi yang dalam adalah dua koleksi dengan semua elemen dalam koleksi asli digandakan.


592
2017-10-08 20:29



Breadth vs Depth; berpikir dalam bentuk pohon referensi dengan objek Anda sebagai simpul akar.

Dangkal:

Before Copy Shallow Copying Shallow Done

Variabel A dan B merujuk ke area memori yang berbeda, ketika B ditugaskan ke A, dua variabel merujuk ke area memori yang sama. Kemudian modifikasi pada konten baik langsung tercermin dalam konten lain, karena mereka berbagi konten.

Dalam:

Before Copy Deep Copying Deep Done

Variabel A dan B merujuk ke area memori yang berbeda, ketika B ditugaskan ke A nilai-nilai di area memori dimana A menunjuk untuk disalin ke dalam area memori yang menjadi poin B. Kemudian modifikasi pada konten baik tetap unik untuk A atau B; isinya tidak dibagikan.


711
2017-10-08 20:39



Singkatnya, itu tergantung pada apa yang menunjuk pada apa. Dalam salinan dangkal, objek B menunjuk ke lokasi objek A di memori. Dalam salinan mendalam, semua benda dalam lokasi memori A disalin ke lokasi memori objek B.

Artikel wiki ini memiliki diagram yang bagus.

http://en.wikipedia.org/wiki/Object_copy


135
2017-10-08 20:24



Khususnya untuk Pengembang iOS: 

Jika B adalah salinan dangkal dari A, maka untuk data primitif itu seperti B = [A assign]; dan untuk benda-benda itu seperti B = [A retain];

B dan A menunjuk ke lokasi memori yang sama

Jika B adalah salinan dalam dari A, maka itu seperti B = [A copy];

B dan A menunjuk ke lokasi memori yang berbeda

Alamat memori B sama dengan A

B memiliki isi yang sama dengan A


68
2018-01-23 11:43



Salinan yang dangkal: Menyalin nilai anggota dari satu objek ke objek lainnya.

Salin Jauh: Menyalin nilai anggota dari satu objek ke objek lainnya.
Setiap objek penunjuk digandakan dan Deep Copied.

Contoh:

class String
{
     int   size;
     char* data;
};

String  s1("Ace");   // s1.size = 3 s1.data=0x0000F000

String  s2 = shallowCopy(s1);
 // s2.size =3 s2.data = 0X0000F000
String  s3 = deepCopy(s1);
 // s3.size =3 s3.data = 0x0000F00F
 //                      (With Ace copied to this location.)

54
2017-10-08 20:25



Coba pertimbangkan gambar berikut

enter image description here

Sebagai contoh Object.MemberwiseClone menciptakan a dangkal salinan link

dan menggunakan ICloneable antarmuka yang bisa Anda dapatkan dalam salin seperti yang dijelaskan sini


51
2018-06-15 08:42



Saya belum melihat jawaban yang singkat dan mudah dimengerti di sini - jadi saya akan mencobanya.

Dengan salinan dangkal, objek apa pun yang ditunjukkan oleh sumber juga ditunjukkan oleh tujuan (sehingga tidak ada benda referensi yang disalin).

Dengan salinan yang dalam, setiap objek yang ditunjuk oleh sumber disalin dan salinannya ditunjukkan oleh tujuan (jadi sekarang akan ada 2 objek yang dirujuk). Ini recurses bawah pohon objek.


40
2017-10-08 20:36