שיעורי מודול (2/2)
אוספים ו-ArrayList
למערכים מסורתיים בג'אווה יש גודל קבוע המוגדר בזמן היצירה. כדי לעבוד עם רשימות נתונים שגודלם יכול להשתנות באופן דינמי, Java מספקת את מסגרת אוספי Java. המחלקה הנפוצה ביותר היא ArrayList.
הכיתה ArrayList והגנריות
ArrayList מיישם מערך שניתן לשנות את גודלו בזיכרון. כדי להכריז על ArrayList, עלינו לציין את סוג האלמנטים שהוא יכיל על ידי הגדר אותו בסוגריים זווית < >. תכונה זו נקראת גנריות.
כדי להשתמש ב-ArrayList, עלינו לייבא אותו בתחילת הקובץ מ-java.util.ArrayList.
הצהרה ומופע:
import java.util.ArrayList;
ArrayList<String> shoppingList = new ArrayList<>();שיטות ליבה
להלן הפעולות הבסיסיות ב-ArrayList:
add(element): מוסיף אלמנט לסוף הרשימה.get(index): מחזירה את הרכיב באינדקס שצוין (אינדקס 0).size(): מחזירה את מספר האלמנטים שנמצאים כעת ברשימה.remove(index): מסיר את האלמנט באינדקס שצוין.
shoppingList.add("Pane");
shoppingList.add("Latte");
System.out.println("Elementi: " + shoppingList.size()); // Prints 2
System.out.println("Primo elemento: " + shoppingList.get(0)); // Prints "Pane"חזרה על רשימה (לכל אחד)
הלולאה לכל אחד היא המבנה האידיאלי לחזור על כל האלמנטים של האוסף:
for (String item : shoppingList) {
System.out.println(item);
}מערך לעומת ArrayList: זיכרון וביצועים
למרות ש-ArrayList גמיש הרבה יותר ממערך סטטי, הוא מגיע עם פשרות לגבי ביצועים וזיכרון:
- מערך סטטי: הוא מוקצה בבלוק זיכרון רציף, יש לו גודל קבוע, והגישה לאלמנטים באמצעות אינדקס מהירה במיוחד. הוא מאחסן טיפוסים פרימיטיביים ישירות ללא תקורה.
- ArrayList: באופן פנימי, הוא מנהל מערך שגודלו משתנה (על ידי יצירת מערך חדש גדול יותר והעתקת אלמנטים ישנים) כאשר חריגה מהקיבולת הראשונית שלו (בדרך כלל 10). יתר על כן, הוא מאחסן רק הפניות לאובייקט, ומציג תקורה של זיכרון עבור כל אלמנט.
אוטובוקסינג ו-Unboxing
מכיוון ש-ArrayList יכול להחזיק רק אובייקטים, Java מבצעת המרות אוטומטית בין טיפוסים פרימיטיביים ומחלקות העטיפה המתאימות שלהם:
- אוטובוקסינג: המרה אוטומטית מטיפוס פרימיטיבי למחלקת עטיפה. לדוגמה, כאשר אתה כותב
numbers.add(42), Java ממירה אוטומטית את42(int) ל-Integer.valueOf(42)(מספר שלם). - Unboxing: המרה אוטומטית ממעמד עטיפה לסוג פרימיטיבי. לדוגמה, כאשר אתה מבצע את
int num = numbers.get(0), Java ממירה באופן פנימי אתIntegerלint.
נסה זאת בעצמך
ייבוא ArrayList, הכריז על ArrayList של מחרוזת שמות. הוסף את אליס ובוב לרשימה ולאחר מכן הדפס את הגודל שלו בשיטת size() .
הצג רמז
כלול 'import java.util.ArrayList;' בחלק העליון. צור את הרשימה עם `ArrayList<String> names = new ArrayList<>();`, הוסף את האלמנטים והדפיס את גודלה באמצעות `names.size()`.
הפתרון זמין לאחר 3 ניסיונות
הכריז על ArrayList של מספרים שלמים בשם מספרים, הוסף את המספר 42 והדפיס אותו על ידי שליפתו באינדקס 0 באמצעות get().
הצג רמז
השתמש ב-`ArrayList<Integer> numbers = new ArrayList<>();` (עם מחלקת המעטפת Integer) והדפיס אותו עם `System.out.println(numbers.get(0));`.
הפתרון זמין לאחר 3 ניסיונות
הכריז על ArrayList של צבעים בשם מחרוזת. הוסף את הצבעים אדום, ירוק וכחול לרשימה. לבסוף, השתמש בלולאה של כל אחד כדי לחזור על הרשימה ולהדפיס כל צבע למסך.
הצג רמז
הכריז על הרשימה עם `ArrayList<String> colors = new ArrayList<>();`, הוסף את שלושת הצבעים והשתמש בלולאה `for (String c : colors)` כדי להדפיס אותם באמצעות `System.out.println(c);`.
הפתרון זמין לאחר 3 ניסיונות