אתחל HashMap בג'אווה

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

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

נשתמש ב- Java 8 וכן ב- Java 9.

2. האתחול הסטטי של סטטי מפת גיבוב

אנו יכולים לאתחל א מפת גיבוב באמצעות א סטָטִי גוש קוד:

מאמר מפה סטטית ציבורית מפה MapOne; סטטי {articleMapOne = HashMap חדש (); articleMapOne.put ("ar01", "מבוא למפה"); articleMapOne.put ("ar02", "מאמר כלשהו"); }

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

בואו ונלך לבדוק את זה:

@Test הציבור בטל givenStaticMap_whenUpdated_thenCorrect () {MapInitializer.articleMapOne.put ("NewArticle1", "המרת מערך לרשימה"); assertEquals (MapInitializer.articleMapOne.get ("NewArticle1"), "המרת מערך לרשימה"); }

אנו יכולים לאתחל את המפה באמצעות התחביר הסוגר כפול:

מפה doubleBraceMap = HashMap חדש () {{put ("key1", "value1"); put ("key2", "value2"); }};

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

3. שימוש באוספי Java

אם עלינו ליצור מפה בלתי ניתנת לשינוי של יחיד עם ערך יחיד, Collections.singletonMap () הופך להיות מאוד שימושי:

מפה סטטית ציבורית createSingletonMap () {return Collections.singletonMap ("שם משתמש 1", "סיסמה 1"); }

שים לב שהמפה כאן אינה ניתנת לשינוי, ואם ננסה להוסיף עוד ערכים, היא תזרוק java.lang.UnupportedOperationException.

נוכל גם ליצור מפה ריקה שאינה ניתנת לשינוי באמצעות Collections.emptyMap ():

מפה emptyMap = Collections.emptyMap ();

4. דרך 8 של ג'אווה

בחלק זה, בואו נבדוק את הדרכים לאתחול מפה באמצעות Java 8 ממשק API של זרם.

4.1. באמצעות Collectors.toMap ()

בואו נשתמש ב- זרם של דו מימד חוּט מערך ואוסף אותם למפה:

מפה מפה = Stream.of (מחרוזת חדשה [] [] {{"שלום", "עולם"}, {"ג'ון", "איילה"},}). אסוף (Collectors.toMap (נתונים -> נתונים [0] , נתונים -> נתונים [1]));

שימו לב כאן לסוג הנתונים של המפתח והערך של ה- מַפָּה אותו הדבר.

על מנת להפוך אותו לגנרי יותר, בוא ניקח את מערך חפצים ולבצע את אותה פעולה:

 מפה מפה = Stream.of (אובייקט חדש [] [] {{"data1", 1}, {"data2", 2},}). אסוף (Collectors.toMap (נתונים -> (מחרוזת) נתונים [0], נתונים -> (שלם) נתונים [1]));

כתוצאה מכך, אנו יוצרים מפה של המפתח כ- חוּט וערך כ- מספר שלם.

4.2. שימוש בזרם של מפה. כניסה

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

ראשית, בואו נשתמש SimpleEntry יישום ה- כְּנִיסָה מִמְשָׁק:

מפה מפה = Stream.of (חדש AbstractMap.SimpleEntry ("רעיון", 1), חדש AbstractMap.SimpleEntry ("נייד", 2)) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue));

עכשיו בואו ניצור את המפה באמצעות SimpleImmutableEntry יישום:

מפת מפה = Stream.of (AbstractMap.SimpleImmutableEntry חדש ("רעיון", 1), AbstractMap.SimpleImmutableEntry חדש ("נייד", 2)) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue));

4.3. אתחול מפה בלתי ניתנת לשינוי

במקרים מסוימים של שימוש, עלינו לאתחל מפה בלתי ניתנת לשינוי. ניתן לעשות זאת על ידי גלישת ה- Collectors.toMap () בְּתוֹך Collectors.collectingAndThen ():

מפת מפה = Stream.of (מחרוזת חדשה [] [] {{"שלום", "עולם"}, {"ג'ון", "איילה"},}). אסוף (Collectors.collectingAndThen (Collectors.toMap (נתונים -> נתונים [0], נתונים -> נתונים [1]), אוספים :: unmodifiableMap));

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

5. Java 9 Way

Java 9 מגיע עם שיטות מפעל שונות ב- מַפָּה ממשק שמפשט את היצירה והאתחול של מפות בלתי ניתנות לשינוי.

בואו ונבחן את שיטות המפעל הללו.

5.1. מפה של()

בשיטת המפעל הזו אין שום טיעון, טיעון יחיד וטיעונים משתנים:

מפה emptyMap = Map.of (); Map singletonMap = Map.of ("key1", "value"); מפה מפה = Map.of ("key1", "value1", "key2", "value2");

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

5.2. Map.ofEntries ()

זה דומה ל מפה של() אך אין לו מגבלות על מספר זוגות ערך המפתח:

מפת מפה = Map.ofEntries (חדש AbstractMap.SimpleEntry ("שם", "ג'ון"), חדש AbstractMap.SimpleEntry ("עיר", "בודפשט"), חדש AbstractMap.SimpleEntry ("zip", "000000"), חדש AbstractMap.SimpleEntry ("בית", "1231231231");

שים לב ששיטות המפעל מייצרות מפות בלתי ניתנות לשינוי, ומכאן שכל מוטציה תביא ל- לא נתמךOperationException.

כמו כן, הם אינם מאפשרים מפתחות אפס או מפתחות כפולים.

כעת, אם אנו זקוקים למפה משתנה או הולכת וגדלה לאחר האתחול, אנו יכולים ליצור כל אחד מהיישומים של ה- מַפָּה ממשק והעביר את המפות הבלתי ניתנות לשינוי בבנאי:

מפת מפה = HashMap חדש (Map.of ("key1", "value1", "key2", "value2")); מפה map2 = HashMap חדש (Map.ofEntries (AbstractMap.SimpleEntry חדש ("שם", "ג'ון"), AbstractMap.SimpleEntry חדש ("עיר", "בודפשט")));

6. שימוש בגויאבה

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

מאמרים במפה = ImmutableMap.of ("כותרת", "המאמר החדש שלי", "כותרת 2", "מאמר שני");

זה ייצור מפה בלתי ניתנת לשינוי, וכדי ליצור מפה ניתנת לשינוי:

מאמרים במפה = Maps.newHashMap (ImmutableMap.of ("כותרת", "המאמר החדש שלי", "כותרת 2", "מאמר שני");

השיטה ImmutableMap.of () יש לו גם גרסאות עמוסות שיכולות לקחת עד 5 זוגות של פרמטרי ערך מפתח. הנה איך תיראה דוגמה עם שני זוגות פרמטרים:

ImmutableMap.of ("key1", "value1", "key2", "value2");

7. מסקנה

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

כמו תמיד, קוד המקור לדוגמה נמצא בפרויקט Github. דוגמאות Java 9 נמצאות כאן, ומדגם Guava כאן.