היכולת של ArrayList לעומת גודל של מערך ב- Java

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

ג'אווה מאפשרת לנו ליצור מערכים בגודל קבוע או להשתמש בשיעורי איסוף כדי לבצע עבודה דומה.

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

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

2. דוגמא

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

2.1. גודל מערך

ב- Java, חובה לציין את גודל המערך בעת יצירת מופע חדש שלו:

מספר שלם [] מערך = מספר שלם חדש [100]; System.out.println ("גודל מערך:" + array.length);

הנה, יצרנו אנימספר שלם מערך בגודל 100, שהביא לפלט שלהלן

גודל מערך: 100

2.2. קיבולת של רשימת מערך

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

רשימת רשימה = ArrayList חדש (100); System.out.println ("גודל הרשימה הוא:" + list.size ());
גודל הרשימה הוא: 0

מכיוון שעדיין לא נוספו אלמנטים, הגודל הוא אפס.

כעת, בואו נוסיף אלמנט לרשימה ונבדוק את גודלו:

list.add (10); System.out.println ("גודל הרשימה הוא:" + list.size ());
גודל הרשימה הוא: 1

3. גודל מערכים לעומת רשימת מערך

להלן כמה הבדלים עיקריים בין גודל המערך לבין הקיבולת של רשימת מערך.

3.1. שינוי גודל

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

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

3.2. הקצאת זיכרון

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

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

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

4. מתי לבצע אתחול רשימת מערך עם קיבולת

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

4.1. בניית גדול רשימת מערך

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

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

4.2. בניין מכפיל קטן רשימת מערךס

אם יש לנו הרבה אוספים קטנים, הקיבולת האוטומטית של רשימת מערך עשוי לספק אחוז גדול של זיכרון מבוזבז. בואו נגיד את זה רשימת מערך מעדיף גודל של 10 עם מספרים קטנים יותר של אלמנטים, אך אנו מאחסנים רק 2 או 3. כלומר, 70% זיכרון מבוזבז, מה שיכול להיות חשוב אם יש לנו מספר עצום של רשימות אלה.

הגדרת קיבולת מראש יכולה להימנע ממצב זה.

5. הימנעות מפסולת

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

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

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

6. סיכום

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

כמו תמיד, קוד הדוגמה זמין ב- GitHub.


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