העתקת HashMap בג'אווה

1. סקירה כללית

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

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

2. עותקים רדודים לעומת עמוקים

ראשית, בואו להבין את המושג העתקים הרדודים והעמוקים ב- HashMaps.

2.1. עותק רדוד

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

לדוגמא, ניצור עוֹבֵד בכיתה ואז מפה עם עוֹבֵד מקרים כערכים:

שכבה ציבורית עובד {שם מחרוזת פרטי; // קונסטרוקטור, גטרים וקובעים} 
מפת HashMap = HashMap חדש (); עובד emp1 = עובד חדש ("ג'ון"); עובד emp2 = עובד חדש ("נורמן"); map.put ("emp1", emp1); map.put ("emp2", emp2); 

כעת נוודא שהמפה המקורית והעותק הרדוד שלה הם אובייקטים שונים:

HashMap shallowCopy = // יישום עותק רדוד assertThat (shallowCopy) .isNotSameAs (מפה);

מכיוון שמדובר בעותק רדוד, אם נשנה עוֹבֵד מאפייני המופע, זה ישפיע גם על המפה המקורית וגם על העותק הרדוד שלה:

emp1.setFirstName ("ג'וני"); assertThat (shallowCopy.get ("emp1")). isEqualTo (map.get ("emp1"));

2.2. העתק עמוק

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

כאן, שינוי מפורש של המיפויים (ערכי המפתח) לא ישפיע על העותק העמוק:

HashMap deepCopy = // יישום העתקה עמוקה emp1.setFirstName ("ג'וני"); assertThat (deepCopy.get ("emp1")). isNotEqualTo (map.get ("emp1")); 

3. מפת גיבוב ממשק API

3.1. משתמש ב מפת גיבובגמדריך

מפת גיבובבנאי פרמטרי HashMap (מפה מ ')מספק דרך מהירה להעתיק מפה שלמה:

HashMap shallowCopy = חדש HashMap (originalMap); 

3.2. באמצעות Map.clone ()

בדומה לבנאי, ה מפת גיבוב#שיבוט השיטה יוצרת גם עותק רדוד מהיר:

HashMap shallowCopy = originalMap.clone (); 

3.3. באמצעות Map.put ()

א מפת גיבוב ניתן להעתיק רדוד בקלות על ידי איטרציה מעל כל ערך והתקשרות ל לָשִׂים() שיטה במפה אחרת:

HashMap shallowCopy = HashMap חדש (); מַעֲרֶכֶת ערכים = originalMap.entrySet (); עבור (Map.Entry mapEntry: entries) {shallowCopy.put (mapEntry.getKey (), mapEntry.getValue ()); } 

3.4. באמצעות Map.putAll ()

במקום לחזור על כל הערכים, נוכל להשתמש ב- putAll () שיטה, שמעתיקה את כל המיפויים בצורה רדודה בשלב אחד:

HashMap shallowCopy = HashMap חדש (); shallowCopy.putAll (originalMap); 

עלינו לציין זאת לָשִׂים() ו putAll () החלף את הערכים אם יש מפתח תואם.

מעניין לציין שאם נסתכל על מפת גיבובבונה, שיבוט (), ו putAll () היישום, נגלה שכולם משתמשים באותה שיטה פנימית להעתקת רשומות - putMapEntries ().

4. העתקה מפת גיבובשימוש ב- Java 8 זרם ממשק API

אנו יכולים להשתמש ב- Java 8 זרם API ליצירת עותק רדוד של מפת גיבוב:

מַעֲרֶכֶת ערכים = originalMap.entrySet (); HashMap shallowCopy = (HashMap) entries.stream () .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue)); 

5. גויאבה של גוגל

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

מפת מפה = ImmutableMap.builder () .put ("emp1", emp1) .put ("emp2", emp2) .build (); מפה shallowCopy = ImmutableMap.copyOf (מפה); assertThat (shallowCopy) .isSameAs (מפה);

6. אפאצ'י קומונס לאנג

כעת, אין ל- Java יישומי עותק עמוקים מובנים. אז כדי ליצור עותק עמוק, או שנוכל לעקוף את שיבוט () שיטה או השתמש בטכניקת סדר-דה-סידור.

לאפאצ'י קומונס יש SerializationUtils עם שיבוט () שיטה ליצירת עותק עמוק. לשם כך, כל מחלקה שתכלול בעותק עמוק חייבת ליישם את ה- ניתן לבצע סדרתי מִמְשָׁק:

מחלקה ציבורית מיישמת עובדים באמצעות Serializable {// פרטי יישום} HashMap deepCopy = SerializationUtils.clone (originalMap);

7. מסקנה

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

כמו כן, חקרנו כמה מהספריות החיצוניות שהן די שימושיות ליצירת עותקים רדודים ועמוקים.

קוד המקור השלם של יישומים אלה יחד עם מבחני היחידות זמינים בפרויקט GitHub.


$config[zx-auto] not found$config[zx-overlay] not found