הארכת אורך מערך

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

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

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

2. שימוש Arrays.copyOf

ראשית, בואו נסתכל על Arrays.copyOf. נעתיק את המערך ונוסיף אלמנט חדש להעתק:

מספר שלם ציבורי [] addElementUsingArraysCopyOf (Integer [] srcArray, int elementToAdd) {Integer [] destArray = Arrays.copyOf (srcArray, srcArray.length + 1); destArray [destArray.length - 1] = elementToAdd; להחזיר destArray; }

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

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

בהתאם לסוג הנתונים, התנהגות המילוי תהיה שונה. לדוגמא, אם אנו משתמשים בסוגי נתונים פרימיטיביים במקום מספר שלם ואז האלמנטים הנוספים מתמלאים באפסים. במקרה של לְהַשְׁחִיר, Arrays.copyOf ימלא אלמנטים נוספים עם ריק ובמקרה של בוליאני, עם שֶׁקֶר.

3. שימוש רשימת מערך

הדרך הבאה בה נסתכל היא שימוש רשימת מערך.

אנחנו קודם להמיר את המערך ל- רשימת מערךואז הוסף את האלמנט. ואז אנחנו להמיר את רשימת מערך בחזרה למערך:

מספר שלם ציבורי [] addElementUsingArrayList (מספר שלם [] srcArray, int elementToAdd) {Integer [] destArray = מספר שלם חדש [srcArray.length + 1]; ArrayList arrayList = ArrayList חדש (Arrays.asList (srcArray)); arrayList.add (elementToAdd); return arrayList.toArray (destArray); }

שים לב שעברנו את srcArray על ידי המרתו לא אוסף. ה srcArray רָצוֹן אכלס את המערך הבסיסי ב רשימת מערך.

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

4. שימוש System.arraycopy

לבסוף, נסתכל על System.arraycopy, שדי דומה ל Arrays.copyOf:

מספר שלם ציבורי [] addElementUsingSystemArrayCopy (Integer [] srcArray, int elementToAdd) {Integer [] destArray = Integer [srcArray.length + 1]; System.arraycopy (srcArray, 0, destArray, 0, srcArray.length); destArray [destArray.length - 1] = elementToAdd; להחזיר destArray; }

עובדה מעניינת אחת היא ש Arrays.copyOf משתמש באופן פנימי בשיטה זו.

כאן נוכל להבחין בכך שאנחנו העתק את האלמנטים מה- srcArray ל destArray ואז הוסף את האלמנט החדש אל ה destArray.

5. ביצועים

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

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

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

6. מסקנה

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

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


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