Java ArrayList לעומת Vector

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

במדריך זה, אנו נתמקד בהבדלים בין רשימת מערך ו וֶקטוֹר שיעורים. שניהם שייכים למסגרת אוספי Java ומיישמים את ה- java.util.List מִמְשָׁק.

למרות זאת, לשיעורים אלה יש הבדלים משמעותיים ביישומים שלהם.

2. מה שונה?

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

  • סנכרון - ההבדל העיקרי הראשון בין שני אלה. וֶקטוֹר מסונכרן ו רשימת מערך לא.
  • צמיחת גודל - הבדל נוסף בין השניים הוא הדרך בה הם משנים את גודלם תוך כדי יכולתם. ה וֶקטוֹר מכפיל את גודלו. בניגוד, רשימת מערך עולה רק במחצית מאורכו
  • איטרציה - וגם וֶקטוֹר יכול להשתמש איטרטור ו ספירה לחצות את האלמנטים. מצד שני, רשימת מערך יכול להשתמש רק איטרטור.
  • ביצועים - בעיקר בגלל סנכרון, וֶקטוֹר הפעילות איטית יותר בהשוואה ל- רשימת מערך
  • מסגרת - כמו כן, רשימת מערך הוא חלק ממסגרת האוספים והוצג ב- JDK 1.2. בינתיים, וֶקטוֹר קיים בגירסאות הקודמות של Java ככיתה מדור קודם.

3. וֶקטוֹר

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

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

אנו יכולים ליצור וקטור בצורה אופיינית:

וקטור וקטורי = וקטור חדש ();

קונסטרוקטור ברירת המחדל יוצר ריק וֶקטוֹר עם קיבולת ראשונית של 10.

בואו נוסיף כמה ערכים:

vector.add ("באלדונג"); vector.add ("וקטור"); vector.add ("דוגמה");

ולסיום, בואו נחזור על הערכים באמצעות ה- איטרטור מִמְשָׁק:

איטרטור איטרטור = vector.iterator (); בעוד (iterator.hasNext ()) {אלמנט מחרוזת = iterator.next (); // ...}

לחלופין, אנו יכולים לחצות את וֶקטוֹר באמצעות ספירה:

ספירה e = vector.elements (); while (e.hasMoreElements ()) {Element String = e.nextElement (); // ...}

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

4. מקביליות

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

סנכרון ציבורי E לקבל (אינדקס int)

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

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

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

לדוגמא, אנו יכולים להשתמש CopyOnWriteArrayList אוֹ Collections.synchronizedList כדי לקבל אפקט דומה לזה וֶקטוֹר:

vector.get (1); // Collections.synchronizedList (arrayList) מסונכרנים .get (1); // גם מסונכרן

5. ביצועים

כפי שכבר דנו לעיל, וֶקטוֹר מסונכרן הגורם להשפעה ישירה על הביצועים.

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

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

ראשוןבואו נבדוק את לקבל() שיטה:

@Benchmark עובד שכיר testGet (ArrayListBenchmark.MyState המדינה) {להחזיר state.employeeList.get (state.employeeIndex); } @Benchmark עובד שכיר testVectorGet (ArrayListBenchmark.MyState המדינה) {להחזיר state.employeeVector.get (state.employeeIndex); }

נגדיר את JMH לשימוש בשלושה שרשורים ובעשרה איטרציות חימום.

ובואו נדווח על הזמן הממוצע לפעולה ברמה הננו-שנייה:

יחידות מידה של ציון Cnt ציון יחידות ArrayListBenchmark.testGet avgt 20 9.786 ± 1.358 ns / op ArrayListBenchmark.testVectorGet avgt 20 37.074 ± 3.469 ns / op

אנחנו יכולים לראות את זה ArrayList # קבל עובד בערך שלוש פעמים יותר מ- וקטור # קבל.

עכשיו, בואו נשווה את התוצאות של ה- מכיל () מבצע:

@Benchmark מבחן בוליאני ציבוריContains (ArrayListBenchmark.MyState state) {return state.employeeList.contains (state.employee); } @Benchmark test test בוליאני ציבורי ContainsVector (ArrayListBenchmark.MyState state) {return state.employeeVector.contains (state.employee); }

והדפיס את התוצאות:

יחידות מידה של ציון Cnt ציון יחידות ArrayListBenchmark.test מכיל avgt 20 8.665 ± 1.159 ns / op ArrayListBenchmark.testContainsVector avgt 20 36.513 ± 1.266 ns / op

כפי שאנו רואים, עבור מכיל () פעולה, זמן הביצועים עבור וֶקטוֹר הוא הרבה יותר ארוך מ רשימת מערך.

6. סיכום

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

כרגיל, הקוד השלם למאמר זה זמין באתר GitHub.