GrabDuck

Класс ArrayList и интерфейс List | Java

:

Последнее обновление: 10.12.2015

Класс ArrayList представляет обобщенную коллекцию, которая наследует свою функциональность от класса AbstractList и применяет интерфейс List. Проще говоря, ArrayList представляет простой список, аналогичный массиву, за тем исключением, что количество элементов в нем не фиксировано.

ArrayList имеет следующие конструкторы:

  • ArrayList(): создает пустой список

  • ArrayList(Collection <? extends E> col): создает список, в который добавляются все элементы коллекции col.

  • ArrayList (int capacity): создает список, который имеет начальную емкость capacity

Емкость в ArrayList представляет размер массива, который будет использоваться для хранения объектов. При добавлении элементов фактически происходит перераспределение памяти - создание нового массива и копирование в него элементов из старого массива. Изначальное задание емкости ArrayList позволяет снизить подобные перераспределения памяти, тем самым повышая производительность.

Некоторые основные методы интерфейса List, которые часто используются в ArrayList:

  • void add(int index, E obj): добавляет в список по индексу index объект obj

  • boolean addAll(int index, Collection<? extends E> col): добавляет в список по индексу index все элементы коллекции col. Если в результате добавления список был изменен, то возвращается true, иначе возвращается false

  • E get(int index): возвращает объект из списка по индексу index

  • int indexOf(Object obj): возвращает индекс первого вхождения объекта obj в список. Если объект не найден, то возвращается -1

  • int lastIndexOf(Object obj): возвращает индекс последнего вхождения объекта obj в список. Если объект не найден, то возвращается -1

  • E remove(int index): удаляет объект из списка по индексу index, возвращая при этом удаленный объект

  • E set(int index, E obj): присваивает значение объекта obj элементу, который находится по индексу index

  • void sort(Comparator<? super E> comp): сортирует список с помощью компаратора comp

  • List<E> subList(int start, int end): получает набор элементов, которые находятся в списке между индексами start и end

Используем класс ArrayList и некоторые его методы в программе:

import java.util.ArrayList;

public class CollectionApp {

    public static void main(String[] args) {
        
        ArrayList<String> states = new ArrayList<String>();
        // добавим в список ряд элементов
        states.add("Германия");
        states.add("Франция");
        states.add("Великобритания");
        states.add("Испания");
        states.add(1, "Италия"); // добавляем элемент по индексу 1
		
		System.out.println(states.get(1));// получаем 2-й объект
		states.set(1, "Дания"); // установка нового значения для 2-го объекта
		
        System.out.printf("В списке %d элементов \n", states.size());
        for(String state : states){
        
            System.out.println(state);
        }
		
        if(states.contains("Германия")){
        
            System.out.println("Список содержит государство Германия");
        }
		
        // удалим несколько объектов
        states.remove("Германия");
        states.remove(0);
        
        Object[] countries = states.toArray();
        for(Object country : countries){
        
            System.out.println(country);
        }
    } 
}

Консольный вывод программы:

Италия
В списке 5 элементов 
Германия
Дания
Франция
Великобритания
Испания
Список содержит государство Германия
Франция
Великобритания
Испания

Здесь объект ArrayList типизируется классом String, поэтому список будет хранить только строки. Поскольку класс ArrayList применяет интерфейс Collection<E>, то мы можем использовать методы данного интерфейса для управления объектами в списке.

Для добавления вызывается метод add. С его помощью мы можем добавлять объект в конец списка: states.add("Германия"). Также мы можем добавить объект на определенное место в списке, например, добавим объект на второе место (то есть по индексу 1, так как нумерация начинается с нуля): states.add(1, "Италия")

Метод size() позволяет узнать количество объектов в коллекции.

Проверку на наличие элемента в коллекции производится с помощью метода contains. А удаление с помощью метода remove. И так же, как и с добавлением, мы можем удалить либо конкретный элемент states.remove("Германия");, либо элемент по индексу states.remove(0); - удаление первого элемента.

Получить определенный элемент по индексу мы можем с помощью метода get(): String state = states.get(1);, а установить элемент по индексу с помощью метода set: states.set(1, "Дания");

С помощью метода toArray() мы можем преобразовать список в массив объектов.

И поскольку класс ArrayList реализует интерфейс Iterable, то мы можем пробежаться по списку в цикле аля for-each: for(String state : states).

Хотя мы можем свободно добавлять в объект ArrayList дополнительные объекты, в отличие от массива, однако в реальности ArrayList использует для хранения объектов опять же массив. По умолчанию данный массив предназначен для 10 объектов. Если в процессе программы добавляется гораздо больше, то создается новый массив, который может вместить в себя все количество. Подобные перераспределения памяти уменьшают производительность. Поэтому если мы точно знаем, что у нас список не будет содержать больше определенного количества элементов, например, 25, то мы можем сразу же явным образом установить это количество, либо в конструкторе: ArrayList<String> states = new ArrayList<String>(25);, либо с помощью метода ensureCapacity: states.ensureCapacity(25);