וקטור או ArrayList - מה עדיף?

ש: וקטור או ArrayList - מה עדיף ולמה?

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

  • ממשק API
  • סִנכְּרוּן
  • צמיחת נתונים
  • דפוסי שימוש

בואו נחקור כל אחד בתורו.

ממשק API

בשנת ה- Java שפת תכנות (Addison-Wesley, יוני 2000) קן ארנולד, ג'יימס גוסלינג, ודוד הולמס לתאר את Vectorכקובץ אנלוגי ArrayList. אז, מנקודת מבט API, שתי הכיתות דומות מאוד. עם זאת, עדיין ישנם כמה הבדלים גדולים בין שתי המעמדות.

סִנכְּרוּן

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

צמיחת נתונים

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

דפוסי שימוש

הן ArrayListוהן Vectorטובים לאחזור אלמנטים ממיקום ספציפי במיכל או להוספה והסרה של אלמנטים מקצה המכולה. ניתן לבצע את כל הפעולות הללו בזמן קבוע - O (1) . עם זאת, הוספה והסרה של אלמנטים מכל עמדה אחרת מוכיחה כי היא יקרה יותר - לינארית ליתר דיוק: O (ni), כאשר n הוא מספר האלמנטים ו- i הוא אינדקס האלמנט שנוסף או הוסר. פעולות אלה יקרות יותר מכיוון שעליך להעביר את כל האלמנטים באינדקס i ומעלה על ידי אלמנט אחד. אז מה המשמעות של כל זה?

המשמעות היא שאם ברצונך להוסיף אלמנטים לאינדקס או להוסיף ולהסיר אלמנטים בסוף המערך, השתמש ב- a Vectorאו ב- ArrayList. אם אתה רוצה לעשות משהו אחר לתוכן, עבור אל עצמך מחלקת מיכל אחרת. לדוגמא, LinkedListיכול להוסיף או להסיר אלמנט בכל מיקום בזמן קבוע - O (1). עם זאת, אינדקס של אלמנט מעט איטי יותר - O (i) כאשר i הוא האינדקס של האלמנט. מעבר ל- A ArrayListהוא גם קל יותר מכיוון שאתה יכול פשוט להשתמש באינדקס במקום שתצטרך ליצור איטרטור. זה LinkedListגם יוצר אובייקט פנימי לכל אלמנט שהוכנס. אז אתה צריך להיות מודע לאשפה הנוספת שנוצרת.

לבסוף, ב- "PRAXIS 41" מ- Java המעשי (אדיסון-ווסלי, פברואר 2000) פיטר האגר מציע לך להשתמש במערך ישן רגיל במקום אחד Vectorאו ArrayList- במיוחד עבור קוד קריטי לביצועים. על ידי שימוש במערך תוכלו להימנע מסנכרון, שיחות שיטה נוספות ושינוי גודל לא אופטימלי. אתה פשוט משלם את עלות זמן הפיתוח הנוסף.

למידע נוסף על נושא זה

  • שפת התכנות ג'אווה קן ארנולד, ג'יימס גוסלינג ודייויד הולמס (אדיסון-ווסלי, יוני 2000; ISBN0201704331)

    //www.amazon.com/exec/obidos/ASIN/0201704331/javaworld/

  • ג'אווה מעשית פיטר האגר (אדיסון-ווסלי, פברואר 2000; ISBN0201616467)

    //www.amazon.com/exec/obidos/ASIN/0201616467/javaworld/

  • רוצה יותר? עיין במדד השאלות והתשובות של Java לקטלוג השאלות והתשובות המלאות

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • במשך 100 טיפים Java תובנה מכמה המוחות הטובים ביותר בעסק, ביקור JavaWorld" s טיפים Java מדד

    //www.javaworld.com/javatips/jw-javatips.index.html

  • הירשם לניוזלטר השבועי של דוא"ל בחינם ל- JavaWorld השבוע, מה חדש ב- JavaWorld

    //idg.net/jw- מנויים

הסיפור הזה, "וקטור או ArrayList - מה עדיף?" פורסם במקור על ידי JavaWorld.