Arrays.asList לעומת ArrayList חדש (Arrays.asList ())

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

במדריך קצר זה, נבחן את ההבדלים בין Arrays.asList (מערך) ו ArrayList (Arrays.asList (מערך)).

2. Arrays.asList

נתחיל עם ה- Arrays.asList שיטה.

בשיטה זו נוכל להמיר ממערך לגודל קבוע רשימה לְהִתְנַגֵד. זֶה רשימה הוא רק עטיפה שהופכת את המערך לזמין כרשימה. לא מועתקים או נוצרים נתונים.

כמו כן, איננו יכולים לשנות את אורכו בגלל אסור להוסיף או להסיר אלמנטים.

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

מחרוזת [] stringArray = מחרוזת חדשה [] {"A", "B", "C", "D"}; List stringList = Arrays.asList (stringArray); 

בואו נראה מה יקרה אם נשנה את האלמנט הראשון של stringList:

stringList.set (0, "E"); assertThat (stringList) .contains בדיוק ("E", "B", "C", "D"); assertThat (stringArray). מכיל בדיוק ("E", "B", "C", "D");

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

בואו ננסה להכניס אלמנט חדש ל- stringList:

stringList.add ("F");
java.lang.UnsupportedOperationException at java.base / java.util.AbstractList.add (AbstractList.java:153) ב- java.base / java.util.AbstractList.add (AbstractList.java:111)

כמו שאנו יכולים לראות, הוספה / הסרה של אלמנטים מ / אל רשימה יזרוק java.lang.UnupportedOperationException.

3. ArrayList (Arrays.asList (מערך))

דומה ל Arrays.asList שיטה, אנחנו יכולים להשתמש ArrayList (Arrays.asList (מערך)) כשאנחנו צריכים ליצור a רשימה מתוך מערך.

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

מחרוזת [] stringArray = מחרוזת חדשה [] {"A", "B", "C", "D"}; רשימת stringList = ArrayList חדש (Arrays.asList (stringArray)); 

עכשיו בואו לשנות את האלמנט הראשון של stringList:

stringList.set (0, "E"); assertThat (stringList) .contains בדיוק ("E", "B", "C", "D");

ועכשיו, בואו נראה מה קרה עם המערך המקורי שלנו:

assertThat (stringArray). מכיל בדיוק ("A", "B", "C", "D");

כמו שאנו יכולים לראות, המערך המקורי שלנו נותר ללא פגע.

לפני שנסכם, אם נסתכל על קוד המקור של JDK, נוכל לראות את ה- Arrays.asList השיטה מחזירה סוג של רשימת מערך זה שונה מ java.util.ArrayList. ההבדל העיקרי הוא שהחזיר רשימת מערך רק עוטף מערך קיים - הוא לא מיישם את לְהוֹסִיף ו לְהַסִיר שיטות.

4. מסקנה

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

כמו תמיד, ניתן למצוא את דגימות הקוד ב- GitHub.