כיצד ליישם העתקה רדודה והעתקה עמוקה בג'אווה



מאמר זה יספק לכם ידע מפורט ומקיף על העתקה רדודה והעתקה עמוקה ב- Java עם דוגמאות.

שיבוט הוא תהליך של יצירת העתק או העתק של אובייקט, שיטת שיבוט Java.lang.Object משמש ליצירת העתק או העתק של אובייקט. אובייקטים של Java המיישמים ממשק Cloneable זכאים להשתמש בשיטת השיבוט. במאמר זה נדון בהעתקה רדודה ובעותק עמוק בסדר הבא:

יצירת העתק של אובייקט Java

אנו יכולים ליצור העתק או העתק של אובייקט Java על ידי





1. יצירת עותק של אובייקט במיקום זיכרון אחר. זה נקרא העתק עמוק.

2. יצירת הפניה חדשה המצביעה על אותו מיקום זיכרון. זה נקרא גם עותק רדוד.



עותק רדוד

יישום ברירת המחדל של שיטת השיבוט יוצר עותק רדוד של אובייקט המקור, זה אומר שנוצר מופע חדש מסוג אובייקט, הוא מעתיק את כל השדות למופע חדש ומחזיר אובייקט חדש מסוג 'אובייקט'. אובייקט זה צריך להיות מודפס באופן מפורש בסוג האובייקט של אובייקט המקור.

לאובייקט זה יהיה עותק מדויק של כל שדות אובייקט המקור כולל הסוג הפרימיטיבי והפניות לאובייקט. אם אובייקט המקור מכיל הפניות לאובייקטים אחרים בשדה, במקרה החדש יהיו רק הפניות לאובייקטים אלה, לא נוצר עותק של אותם אובייקטים. המשמעות היא שאם אנו מבצעים שינויים בעותק רדוד אז השינויים ישתקפו באובייקט המקור. שני המקרים אינם עצמאיים.

שיטת השיבוט במחלקת אובייקטים מוגנת באופיה, ולכן לא כל המחלקות יכולות להשתמש בשיטת clone (). עליך ליישם ממשק Cloneable ולדרוס את שיטת השיבוט. אם ממשק Cloneable לא מיושם, תקבל CloneNotSupportedException.super.clone () יחזיר עותק רדוד לפי היישום במחלקת אובייקט.



קוד להעתקה רדודה

חבילה מחלקה com.test מחלקה {String empId String grade מחרוזת ייעוד המחלקה הציבורית (String empId, String grade, String design) {this.empId = empId this.grade = דרגה this.designation = ייעוד}} מחלקה העובד מיישם Cloneable {int id שם מחרוזת מחלקת מחלקה עובד שכיר (מזהה int, שם מחרוזת, מחלקת מחלקה) {this.id = id this.name = שם this.dept = dept} // גרסת ברירת מחדל לשיטת clone (). זה יוצר עותק רדוד של אובייקט. שיבוט אובייקט מוגן () זורק CloneNotSupportedException {return super.clone ()}} class public ShallowCopyInJava {public static void main (String [] args) {Department dept1 = מחלקה חדשה ('1', 'A', 'AVP') עובד emp1 = עובד חדש (111, 'John', dept1) עובד emp2 = null לנסות {// יצירת שיבוט של emp1 והקצאתו ל- emp2 emp2 = (עובד) emp1.clone ()} לתפוס (CloneNotSupportedException e) {e. printStackTrace ()} // הדפסת הייעוד של 'emp1' System.out.println (emp1.dept.designation) // פלט: AVP // שינוי הייעוד של 'emp2' emp2.dept.designation = 'Director' // שינוי זה יבוא לידי ביטוי במקור העובד 'emp1' System.out.println (emp1.dept.designation) // פלט: מנהל}}

תְפוּקָה:

אלגוריתמי java ומבני נתונים

Output-Shallow-Copy

בדוגמא שלעיל יש לנו מחלקה עובד 1 עם שלושה משתנים מחלקה מזהה (int), שם (מחרוזת) ומחלקה (מחלקה).

כעת שיבטנו את emp1 ל- emp2 כדי ליצור עותק רדוד, לאחר מכן שינינו ייעוד באמצעות אובייקט emp2 ואמתנו שאותם שינויים באו לידי ביטוי גם ב- emp1.


העתק עמוק

העותק העמוק של האובייקט יכלול עותק מדויק של כל שדות אובייקט המקור כמו עותק רדוד, אך בניגוד לעותק רדוד אם לאובייקט המקור יש התייחסות כלשהי לאובייקט כשדות, אז העתק של האובייקט נוצר על ידי קריאת שיבוט שיטה. המשמעות היא שגם אובייקטים של מקור וגם יעד אינם תלויים זה בזה. כל שינוי שנעשה באובייקט המשובט לא ישפיע על אובייקט המקור.

קוד להעתקה עמוקה

מה זה sqoop בהאדופ
חבילה בכיתה com.test מחלקה מיישמת Cloneable {String empId String grade String ייעוד המחלקה הציבורית (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // גרסת ברירת המחדל של השיבוט () שיטה. שיבוט אובייקט מוגן () זורק מחלקה CloneNotSupportedException {return super.clone ()}} שכיר מיישם שכפול {int id שם מחרוזת מחלקה מחלקת ציבור עובד (int id, שם מחרוזת, מחלקת מחלקה) {this.id = id this.name = שם this.dept = dept} // שיטת clone overriding () ליצירת עותק עמוק של אובייקט. שיבוט אובייקט מוגן () זורק CloneNotSupportedException {עובד emp = (עובד) super.clone () emp.dept = (מחלקה) dept.clone () להחזיר emp}} מחלקה ציבורית DeepCopyInJava {ציבורי ריק סטטי ציבורי (מחרוזת [] טענות) { מחלקה מחלקה 1 = מחלקה חדשה ('1', 'A', 'AVP') עובד emp1 = עובד חדש (111, 'ג'ון', מחלקה 1) עובד emp2 = נסי null {// יצירת שיבוט של emp1 והקצאתו ל- emp2 emp2 = (עובד) emp1.clone ()} לתפוס (CloneNotSupportedException e) {e.printStackTrace ()} // הדפסת הכינוי של 'emp1' System.out.println (emp1.dept.designation) // פלט: AVP / / שינוי הייעוד של 'emp2' emp2.dept.designation = 'מנהל' // שינוי זה יבוא לידי ביטוי בעובד המקורי 'emp1' System.out.println (emp1.dept.designation) // פלט: AVP}}

תְפוּקָה:

בדוגמה שלעיל של העתקה עמוקה, בניגוד להעתקה רדודה, אובייקטים של מקור וגם יעד אינם תלויים זה בזה. כל שינוי שנעשה ב- emp2 לא ישפיע על emp1.

ההבדל בין העתקה רדודה להעתקה עמוקה

עותק רדוד העתק עמוק
אובייקט משובט ואובייקט מקור אינם נפרדים לחלוטיןחפצים משובטים וחפצי מקור אינם תלויים זה בזה לחלוטין.
שינויים שבוצעו במקרה המשובט ישפיעו על משתנה הייחוס של אובייקט המקורשינויים שבוצעו במקרה המשובט לא ישפיעו על משתנה הייחוס של אובייקט המקור.
גרסת ברירת המחדל של השיבוט היא העותק הרדודכדי ליצור עותק עמוק עלינו לעקוף את שיטת השיבוט של מחלקת Object.
יש להעדיף העתקה רדודה אם משתני מחלקות של האובייקט הם רק פרימיטיביים כשדותהעתק עמוק עדיף אם למשתני המחלקה של האובייקט יש אזכורים לאובייקטים אחרים כשדות.
זה מהיר יחסיתזה איטי יחסית.

בכך אנו מגיעים לסוף המאמר Shallow Copy ו- Deep Copy. אני מקווה שהבנת את ההבדלים השונים בין השניים.

בדוק את מאת אדוריקה, חברת למידה מקוונת מהימנה עם רשת של יותר מ -250,000 לומדים מרוצים הפרוסים ברחבי העולם. קורס ההכשרה וההסמכה של Java J2EE ו- SOA של אדוריקה מיועד לסטודנטים ואנשי מקצוע שרוצים להיות מפתח Java.

יש לך שאלה עבורנו? אנא הזכיר זאת בקטע ההערות בבלוג 'העתק רדוד והעתקה עמוקה' ונחזור אליך בהקדם האפשרי.