מדריך לרשימת Java ArrayList

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

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

רשימת מערך שוכן בתוך ספריות הליבה של Java, כך שאינך זקוק לספריות נוספות. על מנת להשתמש בו פשוט הוסף את הצהרת הייבוא ​​הבאה:

ייבא java.util.ArrayList;

רשימה מייצג רצף ערכים מסודר כאשר ערך כלשהו עשוי להתרחש יותר מפעם אחת.

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

  • גישה אקראית נדרשת O (1) זְמַן
  • הוספת אלמנט לוקח זמן קבוע מופחת O (1)
  • הוספה / מחיקה לוקח עַל) זְמַן
  • חיפוש לוקח עַל) זמן למערך לא ממוין O (יומן n) למיון

2. צור רשימת מערך

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

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

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

2.1. קונסטרוקטור ללא ברירת מחדל ללא ברירת מחדל

רשימת רשימה = ArrayList חדש (); assertTrue (list.isEmpty ());

אנחנו פשוט יוצרים ריק רשימת מערך למשל.

2.2. קונסטרוקטור מקבל קיבולת ראשונית

רשימת רשימה = ArrayList חדש (20);

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

2.3. קבל קונסטרוקטור אוסף

מספר אוסף = IntStream.range (0, 10) .boxed (). Collect (toSet ()); רשימת רשימה = ArrayList חדש (מספרים); assertEquals (10, list.size ()); assertTrue (numbers.containsAll (רשימה));

שימו לב, האלמנט הזה של אוסף מופע משמשים לאכלוס המערך הבסיסי.

3. הוסף אלמנטים ל רשימת מערך

אתה יכול להכניס אלמנט בסוף או במיקום הספציפי:

רשימת רשימה = ArrayList חדש (); list.add (1L); list.add (2L); list.add (1, 3L); assertThat (Arrays.asList (1L, 3L, 2L), equalTo (רשימה));

אתה יכול גם להוסיף אוסף או כמה אלמנטים בו זמנית:

רשימת רשימה = ArrayList חדש (Arrays.asList (1L, 2L, 3L)); LongStream.range (4, 10) .boxed () .collect (collectionAndThen (toCollection (ArrayList :: new), ys -> list.addAll (0, ys))); assertThat (Arrays.asList (4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L), equalTo (רשימה));

4. איטרציה מעל רשימת מערך

ישנם שני סוגים של איטרטורים זמינים: איטרטור ו ListIterator.

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

כאן נראה לך רק את ListIterator:

רשימת רשימה = ArrayList חדש (IntStream.range (0, 10) .boxed (). Collect (toCollection (ArrayList :: new))); ListIterator it = list.listIterator (list.size ()); תוצאת רשימה = ArrayList חדש (list.size ()); בעוד (it.hasPrevious ()) {result.add (it.previous ()); } Collections.reverse (רשימה); assertThat (תוצאה, equalTo (רשימה));

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

5. חפש ב- רשימת מערך

נדגים כיצד חיפוש עובד באמצעות אוסף:

רשימת רשימה = LongStream.range (0, 16) .boxed () .map (Long :: toHexString) .collect (toCollection (ArrayList :: new)); רשימת stringsToSearch = ArrayList חדש (רשימה); stringsToSearch.addAll (רשימה);

5.1. חיפוש ברשימה לא ממוינת

על מנת למצוא אלמנט שתוכלו להשתמש בו אינדקס של() אוֹ lastIndexOf () שיטות. שניהם מקבלים חפץ וחוזרים int ערך:

assertEquals (10, stringsToSearch.indexOf ("a")); assertEquals (26, stringsToSearch.lastIndexOf ("a"));

אם ברצונך למצוא את כל האלמנטים העומדים בפרדיקט, תוכל לסנן את האוסף באמצעות Java 8 ממשק API של זרם (קראו עוד על כך כאן) באמצעות לְבַסֵס ככה:

הגדר matchingStrings = HashSet חדש (Arrays.asList ("a", "c", "9")); רשימה תוצאה = stringsToSearch .stream () .filter (matchingStrings :: מכיל) .collect (toCollection (ArrayList :: חדש)); assertEquals (6, result.size ());

אפשר גם להשתמש ב- ל לולאה או איטרטר:

Iterator it = stringsToSearch.iterator (); הגדר matchingStrings = HashSet חדש (Arrays.asList ("a", "c", "9")); תוצאת רשימה = ArrayList חדש (); ואילו (it.hasNext ()) {String s = it.next (); אם (matchingStrings.contains (s)) {result.add (s); }}

5.2. חיפוש ברשימה ממוינת

אם יש לך מערך ממוין, תוכל להשתמש באלגוריתם חיפוש בינארי שעובד מהר יותר מאשר חיפוש לינארי:

עותק רשימה = ArrayList חדש (stringsToSearch); Collections.sort (העתק); אינדקס int = Collections.binarySearch (העתק, "f"); assertThat (אינדקס, לא (equalTo (-1)));

שימו לב שאם אלמנט לא נמצא אז -1 יוחזר.

6. הסר את האלמנטים מה- רשימת מערך

על מנת להסיר אלמנט, עליך למצוא את האינדקס שלו ורק לאחר מכן לבצע את ההסרה באמצעות לְהַסִיר() שיטה. גרסה עמוסת יתר של שיטה זו, המקבלת אובייקט, מחפשת אותו ומבצעת הסרה של המופע הראשון של אלמנט שווה:

רשימת רשימה = ArrayList חדש (IntStream.range (0, 10) .boxed (). Collect (toCollection (ArrayList :: new))); Collections.reverse (רשימה); list.remove (0); assertThat (list.get (0), equalTo (8)); list.remove (Integer.valueOf (0)); assertFalse (list.contains (0));

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

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

הגדר matchingStrings = HashSet (Arrays.asList ("a", "b", "c", "d", "e", "f")); Iterator it = stringsToSearch.iterator (); בעוד (it.hasNext ()) {if (matchingStrings.contains (it.next ())) {it.remove (); }}

7. סיכום

במאמר מהיר זה, הסתכלנו על ArrayList בג'אווה.

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

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


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