מהי המחלקה ArrayList?
ArrayList הוא יישום מערך שניתן לשינוי של ממשק List, חלק מ-Collection Framework, אשר אחראי על הרשימה (או המערך הדינמי) הממוקם בחבילת java.utils. מחלקה זו מיישמת את כל פעולות הרשימה האופציונליות ומספקת שיטות לשלוט בגודל המערך המשמש לאחסון הרשימה. ArrayList מבוסס על הרעיון של מערך דינמי. כלומר, היכולת להוסיף ולהסיר אלמנטים, תוך הגדלה או הקטנה לפי הצורך.מה מאחסן ArrayList?
רק סוגי הפניות, אובייקטים כלשהם, כולל מחלקות של צד שלישי. מחרוזות, זרמי פלט, אוספים אחרים. מחלקות עטיפה משמשות לאחסון סוגי נתונים פרימיטיביים.בוני ArrayList
-
רשימת מערך()
בנאי ריק עם קיבולת מערך פנימי התחלתי = 10.
ArrayList<String> list = new ArrayList<>();
רצוי לציין את סוג הערכים המאוחסנים בסוגריים זווית. בדוגמה למעלה -
String
. -
ArrayList(אוסף <? מרחיב E> c)
הבנאי מקבל אוסף נוסף, ויוצר מערך חדש עם האלמנטים של האוסף שעבר:
ArrayList<String> list2 = new ArrayList<>(list);
סדר הרכיבים ברשימה החדשה יהיה זהה למקור.
-
ArrayList(int initialCapacity)
פרמטר הבנאי הוא הערך של הגודל ההתחלתי של המערך הפנימי.
ArrayList<String> list2 = new ArrayList<>(10000);
אם ב-ArrayList הבסיסי נגמר המקום כאשר אלמנטים חדשים מתווספים, נוצר מערך חדש יותר גדול והנתונים מועתקים לתוכו. אם אתה יודע מראש בעת כתיבת הקוד שלך שמספר רב של אלמנטים יעובדו במערך, עליך לציין ערך גדול יותר למטרות אופטימיזציה.
שיטות ArrayList
-
הוסף(E ה)
מוסיף רכיב חדש לסוף הרשימה. מחזיר
boolean
-value ( true - success, false - לא נוסף):ArrayList<String> list = new ArrayList<>(); list.add("Hello");
-
add(int index, E element)
מוסיף אלמנט
element
באינדקס המיקום. בעת הוספה, כל הרכיבים מימין לאינדקס שצוין מוזזים מיקום אחד ימינה:list.add(0, "Amigo");
שימושי מאוד כאשר אתה צריך להכניס אלמנט בכל מקום ברשימה, אבל עבור פעולות הכנסה תכופות בתחילת ובאמצע ArrayList עשויה להיות לא בחירה טובה במיוחד - עליך להסתכל על LinkedList.
-
addAll(Collection <? extends E> collection)
מוסיף את כל רכיבי האוסף לרשימה בסדר שהם מופיעים באוסף.
-
addAll(int index, Collection <? extends E> collection)
Добавление всех элементов
collection
в список начиная с индексаindex
. При этом все элементы сдвинутся вправо на количество элементов в спискеcollection
:ArrayList<String> secondList = new ArrayList<>(); secondList.addAll(list); System.out.println("First addition: " + secondList); secondList.addAll(1, list); System.out.println("Second addition in the middle: " + secondList);
Вывод:
Первое добавление: [Amigo, Hello] Второе добавление в середину: [Amigo, Amigo, Hello, Hello]
Методы
addAll()
также возвращают boolean-результат добавления элементов. -
clear()
Удаление всех элементов из списка.
- clone()
returns an object-копию массива:
ArrayList<String> copyOfSecondList = (ArrayList<String>) secondList.clone(); secondList.clear(); System.out.println(copyOfSecondList);
Вывод:
[Amigo, Amigo, Hello, Hello]
Следует обратить внимание, что метод
clone()
возвращаетObject
, так что после его вызова потребуется сделать приведение к необходимому классу.При клонировании создается новый независимый an object. В примере показано, How очищение клонированного an object не сказалось на составе его клона.
-
contains(Object o)
Проверка наличие an object в списке, возвращает
boolean
-meaning.System.out.println(copyOfSecondList.contains("Hello")); System.out.println(copyOfSecondList.contains("Check"));
Вывод:
true false
-
ensureCapacity(int minCapacity)
Увеличивает размер внутреннего массива, чтобы в него поместилось количество элементов, переданных в
minCapacity
. Если массив достаточно вместителен, ниHowие преобразования не производятся.Этот метод полезен, когда возникает потребность вместить большое количество элементов в несколько итераций. Например, при создании списка емкость его внутреннего массива — 10. При загрузке данных по сети они обрабатываются асинхронно порциями и результаты помещаются в массив. Если ожидается доставка 10 000 элементов, может быть неэффективно просто добавлять эти данные каждый раз: достаточно будет в начале обработки вызвать метод
ensureCapaciry(10000)
и записывать туда данные по мере необходимости. -
forEach(Consumer<? super E> action)
Обработать в цикле ArrayList можно стандартными способами, цикл for:
// First way for(int i = 0; i< secondList.size(); i++) { System.out.println(secondList.get(i)); } И цикл for-each: // Second way for(String s : secondList) { System.out.println(s); }
В классе ArrayList есть метод для обработки каждого element, который называется также, forEach. В качестве аргумента передается реализация интерфейса Consumer, в котором нужно переопределить метод accept():
secondList.forEach(new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } });
Вывод:
Amigo Amigo Hello Hello
Метод accept принимает в качестве аргумента очередной элемент того типа, который хранит в себе ArrayList. Пример для Integer:
ArrayList<Integer> integerList = new ArrayList<>(); integerList.forEach(new Consumer<Integer>() { @Override public void accept(Integer integer) { System.out.println(integer); } });
Метод
action()
будет выполнен для каждого element. -
get(int index)
returns элемент, который расположен в указанной позиции списка.
Если
index < 0
orindex >=
максимального количества элементов списка, будет выброшено исключениеIndexOutOfBoundsException
.Это основной метод получения element из списка, время извлечения element по индексу всегда будет одинаковым, независимо от размера ArrayList.
-
indexOf(Object o)
Метод возвращает индекс первого вхождения element в списке. Если element не существует в списке, метод вернет -1.
-
isEmpty()
Метод возвращает true, если список пустой, false в обратном случае.
Если в списке содержатся только элементы
null
, метод вернет false. Иными словами,null
элементы также учитываются этим методом. -
iterator()
returns итератор для списка для последующего использования в цикле or при любой другой обработке.
Итератор для ArrayList — fail-fast. Это значит, что если коллекция изменится во время итерации, будет выброшено исключение ConcurrentModificationException. Подробнее об fail-fast и его противоположности fail-safe можно почитать здесь.
-
lastIndexOf(Object o)
Функционал метода похож на
indexOf()
, отличие в том, что возвращается индекс последнего element в списке.Если элемент не найден, также возвращает -1.
-
remove(int index)
Удаление element в указанной позиции индекса. После удаления сдвигает все элементы влево для заполнения освободившегося пространства.
Если
index<0
or>=
количество элементов списка, будет выброшено исключениеIndexOutOfBoundsException
. В результате метод возвращает элемент, который был удален. -
remove(Object o)
Метод удаляет из списка переданный элемент
o
. Если элемент присутствует в списке, он удаляется, а все элементы смещаются влево. Если элемент существует в списке и успешно удален, метод возвращает true, в обратном случае — false. -
removeAll(Collection<?> c)
Если необходимо удалить несколько элементов, не стоит делать это в цикле по условию: гораздо удобнее и безопаснее воспользоваться методом
removeAll()
. Он принимает коллекцию элементов, которая будет удалена из списка.Коллекция должна содержать элементы того же типа, которые хранит целевой список. В обратном случае будет выброшен
ClassCastException
. Метод вернет true, если список был изменен в результате вызова метода. -
set(int index, E element)
Замена element в указанной позиции
index
на переданныйelement
. Индекс также должен быть больше нуля и меньше индекса последнего element, иначе будет выброшено исключениеIndexOutOfBoundsException
. -
size()
Лучший способ (практически единственный) для того, чтобы узнать размер массива.
-
sort(Comparator<? super E> c)
Сортировка списка по заданному правилу. Правило сортировки представляет собой реализованный интерфейс
Comparator
с переопределенным методомcompareTo()
.Переопределение нужно, если коллекция содержит an objectы собственного класса. При работе со стандартными классами (
Integer
,String
и так далее) переопределениеcompareTo()
требуется только для нестандартной сортировки. -
toArray()
Превращает список в фиксированный массив. Обратите внимание, что метод возвращает массив an objectов (
Пример:Object[]
). Если необходимо привести список в массив an objectов определенного типа, в качестве параметра в метод можно передать массив, куда будут перемещены элементы списков.String[] array = new String[secondList.size()]; secondList.toArray(array); for(int i = 0; i< array.length; i++) { System.out.println(array[i]); }
Вывод:
Amigo Amigo Hello Hello
להלן השיטות העיקריות של ArrayList.
קישורים לקריאה נוספת
- מאמר מפורט על מערכים דינמיים , או ליתר דיוק על
ArrayList
וLinkedList
, המבצעים את תפקידם בשפת ג'אווה. - מאמר על הסרת אלמנטים מ-ArrayList .
- הרצאה על עבודה עם ArrayList בתרשימים ובתמונות .
GO TO FULL VERSION