Класс ArrayList . Динамический массив. Общие сведения. Создание массива
Класс ArrayList представляет собой динамический массив. В динамическом массиве элементы добавляются и удаляются при необходимости в отличие от стандартных массивов. В стандартном массиве изменить количество элементов массива не получится. Для этого нужно создавать новый массив с новым размером в другом участке памяти и копировать в него данные исходного стандартного массива.
Динамические массивы эффективны в случаях, когда в начале выполнения программы размер массива (данных) неизвестен. Этот размер формируется по мере необходимости.
Класс ArrayList реализует интерфейс List и имеет следующие объявления:
class ArrayList
здесь E – тип сохраняемых объектов.
Список распространенных методов класса следующий:
- add – добавить элемент в массив;
- addAll – добавить набор в массив;
- clear – очистить массив;
- clone – получить копию массива;
- contains – определить, содержится ли в списке определенный элемент;
- containsAll – определить, есть ли все элементы некоторой коллекции в заданной коллекции;
- ensureCapacity – зарезервировать фрагмент памяти для массива;
- get – получить элемент массива;
- indexOf – определить позицию первого вхождения элемента в массиве;
- isEmpty – определить, пустой ли массив;
- iterator – получить итератор на массив;
- lastIndexOf – определить позицию последнего вхождения элемента в массиве;
- listIterator – получить итератор в виде списка;
- remove – удалить элемент в заданной позиции;
- removeAll – удалить группу элементов из коллекции;
- removeIf – изменить коллекцию на основе предиката;
- replaceAll – произвести вычисление над каждым элементом массива;
- retainAll – сформировать новый массив, содержащий элементы заданной коллекции;
- set – установить новое значение в массиве;
- size – получить размер массива;
- sort – рассортировать элементы массива в заданном порядке;
- subList – получить фрагмент массива на основе заданного массива;
- toArray – конвертировать массив в массив типа Object[] ;
- trimToSize – скорректировать текущий размер массива.
2. Конструкторы класса. Создание массива. Пример
В классе ArrayList определены следующие конструкторы:
ArrayList() ArrayList(Collectionextends E>) ArrayList(int size)
Первый конструктор создает пустой динамический массив. Второй конструктор создает динамический массив на основе другого массива.
Третий конструктор создает пустой массив с зарезервированным объемом размера size . Если при наращивании количество элементов в таком массиве превысит size , то зарезервированный объем (максимальная емкость) будет увеличен на некоторую величину.
Пример. В примере создаются разные виды динамических массивов.
import java.util.*; public class TrainCollections < public static void main(String[] args) < // 1. Конструктор ArrayList() // Создать пустой массив целых чисел ArrayList AL = new ArrayList(); // Прибавить к массиву числа от 0 до 9 for (int i=0; iout.println(AL); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] // 2. Создать массив строк на основе другого массива строк, // конструктор ArrayList(Collection) // 2.1. Создать исходный массив ArrayList AS1 = new ArrayList(); AS1.add("Winter"); AS1.add("Spring"); AS1.add("Autumn"); AS1.add("Summer"); System.out.println(AS1); // [Winter, Spring, Autumn, Summer] // 2.2. Использовать конструктор ArrayList(Collection) ArrayList AS2 = new ArrayList(AS1); System.out.println(AS2); // [Winter, Spring, Autumn, Summer] // 3. Конструктор ArrayList(int) // 3.1. Создать пустой массив з зарезервированным размером 8 элементов ArrayList AC = new ArrayList(8); // 3.2. Вывести размер массива System.out.println(AC.size()); // 0 - это есть текущий размер массива > >
Результат выполнения программы
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [Winter, Spring, Autumn, Summer] [Winter, Spring, Autumn, Summer] 0
Связанные темы
Динамический list в java
2. ArrayList(int initialCapacity) – объявление списка с указанием размера преимущественно для случаев, когда будет использоваться большое количество данных и в целях оптимизации следует задавать уже большой размер. Например, используется в случаях, когда список увеличивается с каждым вызовом метода в классе. Размер списка растет с нелинейной скоростью и, если заранее известно, что список будет увеличиваться и будет достигать больших размеров (больше 1e3 элементов), оптимально будет задать изначальный размер и резервировать количество мест заранее.
ArrayList employee = new ArrayList<>(100);
3. ArrayList(Collection c) – объявления списка с уже имеющимся списком, элементы которого были переданы конструктору.
ArrayList cars = new ArrayList<>(Arrays.asList("BMW", "AUDI"));
🧩☕ Интересные задачи по Java для практики можно найти на нашем телеграм-канале «Библиотека задач по Java»
Добавление элементов
Для того чтобы добавить элемент в список, используется простая функция add . Для этого метода есть разновидности:
1. add(E e) – добавление элемента в конец списка. Это функция является возвращаемой. Если элемент был добавлен в список, то ответ – true , иначе – false .
ArrayList fruits = new ArrayList<>(); // ArrayList() создание списка fruits.add("banana"); // добавление элемента fruits.add("apple"); // добавление элемента for (var fruit: fruits) < System.out.println(fruit); // вывод элементов >//output: // banana // apple
2. add(int index, E element) – в данном методе добавление элемента происходит в определенную позицию (index), а все последующие элементы двигаются слева направо. Метод эффективен для небольших размеров списка (когда размер списка не более ~100 элементов). В ином случае – если в программе происходит много сдвигов, то лучше использовать LinkedList.
ArrayList fruits = new ArrayList(); fruits.add("apple"); fruits.add("banana"); fruits.add(1, "watermelon"); // добавляем элемент на 2-ую позицию. for (var fruit : fruits) < System.out.println(fruit); >/*output apple watermelon banana */
3. addAll(Collection ) – добавление списка элементов в конец добавляемого списка. То есть, при вызове данного метода в конец списка добавляются все элементы в таком же порядке.
//список фруктов ArrayList fruits = new ArrayList(); fruits.add("apple"); fruits.add("banana"); fruits.add(1, "watermelon"); //список овощей ArrayList vegetables = new ArrayList<>(); vegetables.add("cucumber"); vegetables.add("carrot"); //список покупок ArrayList groceries = new ArrayList<>(); //добавляем в список покупок овощи и фрукты groceries.addAll(vegetables); groceries.addAll(fruits); for (var item : groceries) < System.out.println(item); >/*output cucumber carrot apple watermelon banana */
4. addAll(int index, Collection ) – это смесь добавления списка и также добавления элемента в определенную позицию. В этом методе в позицию index производится добавление всех элементов из списка, а все последующие элементы смещаются направо.
//список фруктов ArrayList fruits = new ArrayList(); fruits.add("apple"); fruits.add("banana"); fruits.add(1, "watermelon"); //список овощей ArrayList vegetables = new ArrayList<>(); vegetables.add("cucumber"); vegetables.add("carrot"); //список покупок ArrayList groceries = new ArrayList<>(); //добавляем в список покупок овощи и фрукты groceries.addAll(vegetables); groceries.addAll(1, fruits); //добавляем список фруктов на 1-ую позицию списка продуктов //индекс 0, 1, 2, 3, 4 //было - cucumber, carror //стало - cucumber, apple, banana, watermelon, carrot for (var item : groceries) < System.out.println(item); >/*output cucumber apple watermelon banana carrot */
Удаление элементов
В ArrayList, существуют методы для удаления элементов. Всего существуют 3 метода для удаления элемента:
1. remove(int index) – удаление осуществляется, используя индекс определенного элемента. То есть, передается порядковый номер элемента и этот элемента удаляется из списка. Не забываем, что индекс начинается с 0.
//список фруктов ArrayList fruits = new ArrayList(); fruits.add("apple"); fruits.add("banana"); fruits.add("watermelon"); fruits.remove(0); // удаляем первый фрукт for (var fruit : fruits) < System.out.println(fruit); >/* output watermelon banana */
2. remove(object o) – метод удаляет первый встретившийся элемент, который равняется переданному объекту в параметрах. Если проще, то метод проходится по всему списку и ищет элемент, который равняется удаляемому объекту и при нахождении удаляет только первый встретившийся.
//список фруктов ArrayList fruits = new ArrayList(); fruits.add("apple"); fruits.add("banana"); fruits.add("watermelon"); fruits.remove("banana"); // удаляем фрукт банан for (var fruit : fruits) < System.out.println(fruit); >/* output apple watermelon */
3. removaAll(Collection c) – данный метод удаляет все элементы, находящиеся в передаваемом списке.
//список фруктов ArrayList fruits = new ArrayList(); fruits.add("apple"); fruits.add("banana"); fruits.add(1, "watermelon"); ArrayList fruitsToDelete = new ArrayList<>(); fruitsToDelete.add("apple"); fruitsToDelete.add("watermelon"); fruits.removeAll(fruitsToDelete); for (var fruit : fruits) < System.out.println(fruit); >/* output banana */
Вспомогательные методы
В Arraylist встречаются различные методы, которые являются вспомогательными при различных условиях:
1. size() – возвращает размер списка.
//список фруктов ArrayList fruits = new ArrayList(); fruits.add("apple"); fruits.add("banana"); fruits.add(1, "watermelon"); System.out.println(fruits.size()); /* output 3 */
2. sort(Comparator c) – происходит сортировка элементов по заданным параметрам Comparator . Есть уже значения по умолчанию у Comparator , которыми можно пользоваться, Comparator.naturalOrder() , а также Comparator.reverseOrder() .
ArrayList numbers = new ArrayList<>(); numbers.add(1); numbers.add(3); numbers.add(-1); numbers.add(5); //сортирует по возрастанию numbers.sort(Comparator.naturalOrder()); for (var number:numbers) < System.out.print(number + " "); >//переворачивает список в конца numbers.sort(Comparator.reverseOrder()); System.out.println(); for (var number:numbers)
3. toArray() – данный метод превращает список в массив. Он возвращает массив объектов ( Object[] ), но можно вернуть желаемый тип данных и для этого потребуется в метод toArray(Array a) передать уже созданный массив.
ArrayList numbers = new ArrayList<>(); numbers.add(1); numbers.add(3); numbers.add(-1); numbers.add(5); var numbersArray = numbers.toArray(); for (var number:numbersArray) < System.out.print(number + " "); >System.out.println(); //определения типа Integer[], чтобы в тип данных var numbersArrayDefined = new Integer[numbers.size()]; numbers.toArray(numbersArrayDefined); for (var number: numbersArrayDefined) < System.out.print(number + " "); >//output /* 1 3 -1 5 1 3 -1 5 */
4. isEmpty() – проверка списка на наличие элементов. Если список пустой, то возвращает true , в противном случае – false .
ArrayList numbers = new ArrayList<>(); numbers.add(1); numbers.add(3); numbers.add(-1); numbers.add(5); System.out.println(numbers.isEmpty());//false ArrayList numbersEmpty = new ArrayList<>(); System.out.println(numbersEmpty.isEmpty()); //true
5. indexOf(Object o) – метод возвращает позицию передаваемого элемента, и, если элемент не был найден, возвращает -1.
ArrayList fruits = new ArrayList<>(); fruits.add("apple"); fruits.add("banana"); fruits.add("watermelon"); System.out.println(fruits.indexOf("apple")); // 0 System.out.println(fruits.indexOf("banana")); // 1 System.out.println(fruits.indexOf("watermelon")); // 2
6. clear() – удаляет все элементы из списка.
ArrayList fruits = new ArrayList<>(); fruits.add("apple"); fruits.add("banana"); fruits.add("watermelon"); fruits.clear(); // очищаем список System.out.println(fruits.isEmpty()); // true
7. clone() – метод копирует список. После копирования нужно привести к необходимому классу, то есть type casting . Когда список клонируется, создается отдельный независимый объект и удаление родительского списка не влияет на элементы нового списка.
ArrayList fruits = new ArrayList<>(); fruits.add("apple"); fruits.add("banana"); fruits.add("watermelon"); var fruitsNew = (ArrayList)fruits.clone(); fruits.clear(); // очищаем предыдущий список // для проверки что fruitsNew действительно новый список for (var fruit : fruitsNew) < System.out.println(fruit); >/* output * apple * banana * watermelon * */
Также можно прочитать более подробно про все существующие методы ArrayList в документации Oracle по ссылке.