В Java массивы имеют фиксированную длину и не могут быть увеличены или уменьшены. Класс ArrayList реализует интерфейс List и может менять свой размер во время исполнения программы, при этом не обязательно указывать размерность при создании объекта. Элементы ArrayList могут быть абсолютно любых типов в том числе и null.
Пример создания объекта ArrayList
ArrayList list = new ArrayList ();
Можно инициализировать массив на этапе определения. Созданный объект list содержит свойство size. Обращение к элементам массива осуществляется с помощью метода get(). Пример :
ArrayList list; list = Arrays.asList(new String[] ); System.out.println («Размер массива равен ‘» + Integer.valueOf (list.size()) + «‘ элементам»);
Добавление элемента в массив ArrayList, метод add
Работать с ArrayList просто: необходимо создать объект и вставлять созданные объекты методом add(). Обращение к элементам массива осуществляется с помощью метода get(). Пример:
ArrayList list; list = new ArrayList
Замена элемента массива ArrayList, метод set
Чтобы заменить элемент в массиве, нужно использовать метод set() с указанием индекса и новым значением.
Java уроки — ArrayList Список объектов #20 | Java для начинающих
list.add(«Яблоко»); list.add(«Груша»); list.add(«Слива»); list.set(1, «Персик»); System.out.println ( «2-ой элемент массива ‘» + list.get(1) + «‘»);
Удаление элемента массива ArrayList, метод remove
Для удаления элемента из массива используется метод remove(). Можно удалять по индексу или по объекту:
list.remove(0); // удаляем по индексу list.remove(«Слива»); // удаляем по объекту
ПРИМЕЧАНИЕ: элементы, следующие после удалённого элемента, перемещаются на одну позицию ближе к началу. То же самое относится и к операции вставки элемента в середину списка.
Для очистки всего массива используется метод clear():
list.clear();
Определение позиции элемента ArrayList, метод indexOf
В списочном массиве ArrayList существует метод indexOf(), который ищет нужный элемент и возвращает его индекс.
int index = list.indexOf(«Слива»); // выводим имя элемента и его номер в массиве System.out.println (list.get(index) + » числится под номером » + index);
Отсчёт в массиве начинается с 0, если индекс равен 2, значит он является третьим в массиве.
Проверка наличие элемента в ArrayList, метод contains
Чтобы узнать, есть в массиве какой-либо элемент, можно воспользоваться методом contains(), который вернёт логическое значение true или false в зависимости от присутствия элемента в наборе :
System.out.println (list.contains(«Картошка») + «»);
Понятно, что в массиве никаких овощей быть не может, поэтому в консоле будет отображено false.
Создание массива из элементов ArrayList, метод toArray
Для конвертирования набора элементов в обычный массив необходимо использовать метод toArray().
ArrayList myArrayList = new ArrayList(); myArrayList.add(«Россия»); myArrayList.add(«Польша»); myArrayList.add(«Греция»); myArrayList.add(«Чехия»); String[] array = <>; // конвертируем ArrayList в массив array = myArrayList.toArray(new String[myArrayList.size()]);
Интерфейс List
java.util.List является интерфейсом и его следует использовать вместо ArrayList следующим образом :
Продвинутая Java: Динамический массив (ArrayList) — Как устроен?
List list = new ArrayList();
Или укороченный вариант для Java 7:
List list = new ArrayList<>();
В примере тип ArrayList заменен на List, но в объявлении оставлен new ArrayList(). Всё остальное остаётся без изменений. Это является рекомендуемым способом.
Интерфейс List реализует более общий интерфейс коллекции Collection.
Преобразование массива в список, Arrays
Для создания массива можно не только добавлять по одному объекту через метод add(), но и сразу массив с использованием Arrays.asList(. ).
Пример создания и инициализации массива из объектов Integer.
List numlist = Arrays.asList(1, 2, 5, 9, 11); System.out.println (numlist.get(2) + «»); // выводит число 5
У данного способа есть недостаток. Если вы определили списочный массив таким образом, то уже не можете вставлять или удалять элемент, хотя при этом можете изменять существующий элемент.
List numlist = Arrays.asList(1, 2, 5, 9, 11); numlist.set(2, 33); // так можно numlist.add(34); // нельзя, ошибка во время исполнения System.out.println (numlist.get(2) + «»);
Источник: java-online.ru
Как использовать ArrayList в Java: инструкция с примером
Массив ArrayList представляет собой структуру данных, которая динамически расширяется под нужное количество элементов.
Чтобы понять, когда используется ArrayList в Java, посмотрите на диалог ниже:
Взглянем на рисунок, на котором человек растягивает эластичную резинку.
Начальная длина резинки намного меньше. Но когда она растянута, ее длина больше.
На рисунке рядом изображен простой канат. Его нельзя растянуть, поэтому его длина постоянна.
Arraylist подобен эластичной резинке Обычный массив, как канат:
его длина фиксированная.
ArrayList может увеличиваться по мере добавления элементов и уменьшаться после их удаления. Чего не может обычный массив.
Массив похож на канат. Он имеет фиксированную длину и его невозможно расширить.
Array List представляет собой динамический массив или массив переменной длины. Разберем следующий фрагмент кода, который поможет вам в работе с массивом Array List.
ArrayList a = new ArrayList();
Методы ArrayList
- ArrayList add : используется для добавления элементов в Array List. Если ArrayList уже содержит элементы и методу не передается начальный индекс, то новые добавляются после последнего элемента.
add(Object o);
- ArrayList remove: удаляет определенный элемент из массива.
Источник: www.internet-technologies.ru
Структуры данных в картинках. ArrayList
Взбрело мне в голову написать несколько статей, о том как реализованы некоторые структуры данных в Java. Надеюсь, статьи будут полезны визуалам (картинки наше всё), начинающим java-визуалам а также тем кто уже умеет писать new ArrayList(), но слабо представляет что же происходит внутри.
Сегодня поговорим о ArrayList-ах
ArrayList — реализует интерфейс List. Как известно, в Java массивы имеют фиксированную длину, и после того как массив создан, он не может расти или уменьшаться. ArrayList может менять свой размер во время исполнения программы, при этом не обязательно указывать размерность при создании объекта. Элементы ArrayList могут быть абсолютно любых типов в том числе и null.
Создание объекта
ArrayList list = new ArrayList();
Только что созданный объект list, содержит свойства elementData и size.
Хранилище значений elementData есть ни что иное как массив определенного типа (указанного в generic), в нашем случае String[]. Если вызывается конструктор без параметров, то по умолчанию будет создан массив из 10-ти элементов типа Object (с приведением к типу, разумеется).
elementData = (E[]) new Object[10];
Вы можете использовать конструктор ArrayList(capacity) и указать свою начальную емкость списка.
Добавление элементов
list.add(«0»);
Внутри метода add(value) происходят следующие вещи:
1) проверяется, достаточно ли места в массиве для вставки нового элемента;
ensureCapacity(size + 1);
2) добавляется элемент в конец (согласно значению size) массива.
elementData[size++] = element;
Весь метод ensureCapacity(minCapacity) рассматривать не будем, остановимся только на паре интересных мест. Если места в массиве не достаточно, новая емкость рассчитывается по формуле (oldCapacity * 3) / 2 + 1. Второй момент это копирование элементов. Оно осуществляется с помощью native метода System.arraycopy(), который написан не на Java.
// newCapacity — новое значение емкости elementData = (E[])new Object[newCapacity]; // oldData — временное хранилище текущего массива с данными System.arraycopy(oldData, 0, elementData, 0, size);
Ниже продемонстрирован цикл, поочередно добавляющий 15 элементов:
list.add(«1»);
.
list.add(«9»);
list.add(«10»);
При добавлении 11-го элемента, проверка показывает что места в массиве нет. Соответственно создается новый массив и вызывается System.arraycopy().
После этого добавление элементов продолжается
.
list.add(«14»);
Добавление в «середину» списка
list.add(5, «100»);
Добавление элемента на позицию с определенным индексом происходит в три этапа:
1) проверяется, достаточно ли места в массиве для вставки нового элемента;
ensureCapacity(size+1);
2) подготавливается место для нового элемента с помощью System.arraycopy();
System.arraycopy(elementData, index, elementData, index + 1, size — index);
3) перезаписывается значение у элемента с указанным индексом.
elementData[index] = element; size++;
Как можно догадаться, в случаях, когда происходит вставка элемента по индексу и при этом в вашем массиве нет свободных мест, то вызов System.arraycopy() случится дважды: первый в ensureCapacity(), второй в самом методе add(index, value), что явно скажется на скорости всей операции добавления.
В случаях, когда в исходный список необходимо добавить другую коллекцию, да еще и в «середину», стоит использовать метод addAll(index, Collection). И хотя, данный метод скорее всего вызовет System.arraycopy() три раза, в итоге это будет гораздо быстрее поэлементного добавления.
Удаление элементов
Удалять элементы можно двумя способами:
— по индексу remove(index)
— по значению remove(value)
С удалением элемента по индексу всё достаточно просто
list.remove(5);
Сначала определяется какое количество элементов надо скопировать
int numMoved = size — index — 1;
затем копируем элементы используя System.arraycopy()
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
уменьшаем размер массива и забываем про последний элемент
elementData[—size] = null; // Let gc do its work
При удалении по значению, в цикле просматриваются все элементы списка, до тех пор пока не будет найдено соответствие. Удален будет лишь первый найденный элемент.
Дополнение 1: Как верно заметил MikeMirzayanov, при удалении элементов текущая величина capacity не уменьшается, что может привести к своеобразным утечкам памяти. Поэтому не стоит пренебрегать методом trimToSize().
Итоги
— Быстрый доступ к элементам по индексу за время O(1);
— Доступ к элементам по значению за линейное время O(n);
— Медленный, когда вставляются и удаляются элементы из «середины» списка;
— Позволяет хранить любые значения в том числе и null;
— Не синхронизирован.
Ссылки
Пишите в комментариях пожелания/замечания и есть ли смысл продолжать.
Источник: habr.com