רשימת ערכים שלמים פרימיטיביים ב- Java

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

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

נחקור פתרונות באמצעות ליבות Java וספריות חיצוניות.

2. רישום אוטומטי

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

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

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

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

3. שימוש ב- API של Stream

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

במקרים אלה, זה עשוי לעבוד להשתמש ב- Stream 8 של Java 8 במקום ליצור רשימה לחלוטין. ה IntSream class מספק רצף של פרימיטיבי int אלמנטים התומכים בפעולות צבירה עוקבות.

בואו נסתכל במהירות על דוגמה:

זרם IntStream = IntStream.of (5, 10, 0, 2, -8);

ה IntStream.of ()סטָטִי השיטה מחזירה רצף IntStream.

באופן דומה, אנו יכולים ליצור IntStream ממערך קיים של ints:

int [] פרימיטיבים = {5, 10, 0, 2, -8}; זרם IntStream = IntStream.of (פרימיטיביים);

יתר על כן, אנו יכולים להחיל את פעולות ה- Stream API הסטנדרטיות כדי לבצע איטרציה, סינון וצבירה של ה- ints. לדוגמא, אנו יכולים לחשב את הממוצע של החיובי int ערכים:

Optional ממוצע כפול = stream.filter (i -> i> 0). Average ();

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

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

4. שימוש ב- Trove

Trove היא ספרייה בעלת ביצועים גבוהים המספקת אוספים פרימיטיביים עבור Java.

כדי להתקין את Trove with Maven, עלינו לכלול את ה- trov4j תלות שלנו pom.xml:

 net.sf.trove4j trove4j 3.0.2 

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

למשל, יש ממשק TIntList עם שלה TIntArrayList יישום לעבודה עם רשימה של int ערכים:

TIntList tList = TIntArrayList חדש ();

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

היתרון הגדול ביותר בשימוש TIntArrayList הוא רווחיות ביצועים וצריכת זיכרון. אין צורך באגרוף / ביטול אגרוף נוסף מכיוון שהוא שומר את הנתונים בתוך int [] מַעֲרָך.

5. שימוש ב- Fastutil

ספרייה נוספת עם ביצועים גבוהים לעבודה עם הפרימיטיבים היא Fastutil. בואו נוסיף את fastutil תלות:

 it.unimi.dsi מהיר 8.1.0 

עכשיו, אנחנו מוכנים להשתמש בזה:

רשימת IntArrayList = IntArrayList חדש ();

קונסטרוקטור ברירת המחדל IntArrayList () באופן פנימי יוצר מערך של פרימיטיבים עם קיבולת ברירת המחדל של 16. באותו אופן, אנו יכולים לאתחל אותו ממערך קיים:

int [] פרימיטיבים = int int [] {5, 10, 0, 2, -8}; רשימת IntArrayList = IntArrayList חדש (פרימיטיבי);

6. שימוש בקולט

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

ראשית, בואו נוסיף את סוּסוֹן תלות:

 קולט קולט 1.2.0 

הרשימה הפרימיטיבית המציעה ספרייה זו היא cern.colt.list.IntArrayList:

cern.colt.list.IntArrayList coltList = חדש cern.colt.list.IntArrayList ();

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

7. שימוש בגויאבה

גויאבה מספק מספר דרכים להתממשק בין מערכים פרימיטיביים לממשקי API של אוסף. ה com.google.common.primitives החבילה כוללת את כל הכיתות כדי להתאים לסוגים פרימיטיביים.

לדוגמא, ה ImmutableIntArray class מאפשר לנו ליצור רשימה בלתי ניתנת לשינוי של int אלמנטים.

נניח, יש לנו את המערך הבא של int ערכים:

int [] פרימיטיבים = int int [] {5, 10, 0, 2};

אנחנו יכולים פשוט ליצור רשימה עם המערך:

רשימת ImmutableIntArray = ImmutableIntArray.builder (). AddAll (פרימיטיבי) .build ();

יתר על כן, הוא מספק רשימת API עם כל השיטות הסטנדרטיות שהיינו מצפים להם.

8. מסקנה

במאמר מהיר זה, הראינו דרכים רבות ליצירת רשימות עם המספרים השלמים הפרימיטיביים. בדוגמאות שלנו השתמשנו בספריות Trove, Fastutil, Colt ו- Guava.

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