Интерфейс List и класс ArrayList

  1. Интерфейс List
  2. Особенности класса ArrayList
  3. Добавление элементов в класс ArrayList
  4. Методы класса ArrayList для удаления элементов
  5. Пример удаления элементов из ArrayList
  6. Пример использования метода removeAll() класса ArrayList
  7. Пример использования методов addAll(), clear() класса ArrayList
  8. Пример использования метода retainAll() класса ArrayList
  9. Получение массива из ArrayList

1. Интерфейс List

Интерфейс List сохраняет последовательность добавления элементов и позволяет осуществлять доступ к элементу по индексу. Он расширяет интерфейс Collection и таким образом наследует все его методы, и вместе с тем добавляет свои методы:

  1. void add(int index, Е obj) - вставляет obj в вызывающий список в позицию, указанную в index. Любые ранее вставленные элементы за указанной позицией вставки смещаются вверх. То есть никакие элементы не перезаписываются.
  2. bооlеаn addAll (int index,Collection<? extends Е> с) - вставляет все элементы в вызывающий список, начиная с позиции, переданной в index. Все ранее существовавшие элементы за точкой вставки смещаются вверх. То есть никакие элементы не перезаписываются. Возвращает true, если вызывающий список изменяется, и false  в противном случае. 
  3. Е get (int index) - возвращает объект, сохраненный в указанной позиции вызывающего списка.
  4. int indexOf(Object obj) - возвращает индекс первого экземпляра obj в вызывающем списке. Если obj не содержится в списке, возвращается 1.
  5. int lastlndexOf(Object obj) - возвращает индекс последнего экземпляра obj в вызывающем списке. Если obj не содержится в списке, возвращается 1.  
  6. Listlterator listlterator() - возвращает итератор, указывающий на начало списка.
  7. Listlterator listlterator(int index) - возвращает итератор, указывающий на заданную позицию в списке.
  8. Е remove(int index) - удаляет элемент из вызывающего списка в позиции index и возвращает удаленный элемент. Результирующий список уплотняется, то есть элементы, следующие за удаленным, сдвигаются на одну позицию назад.
  9. Е set (int index, Е obj) - присваивает obj элементу, находящемуся в списке в позиции index.
  10. default void sort(Comparator<? super E> c) - сортирует список, используя заданный компаратор (добавлен в версии JDK 8).
  11. List subList (int start, int end) - возвращает список, включающий элементы от start до end-1 из вызывающего списка. Элементы из возвращаемого списка также сохраняют ссылки в вызывающем списке.

Если посмотреть на методы интерфейса List более внимательно, можно заметить, что почти все их них манипулируют индексом элемента.

Структура иерархии интерфейса List:

Интерфейс List и его реализации фото

2. Особенности класса ArrayList

Одной из реализаций интерфейса List является класс ArrayList. Он поддерживает динамические массивы, которые могут расти по мере необходимости. Элементы ArrayList могут быть абсолютно любых типов, в том числе и null. Элементы в этом виде коллекции могут повторяться.

Данный класс используется чаще всех остальных реализаций коллекции.

Внутреннее устройство класса

Давайте начнем изучение этого класса с рассмотрения его внутреннего устройства, что важно для понимания при выборе класса коллекции.

Объект класса ArrayList, содержит свойства elementData и size. Хранилище значений elementData есть не что иное, как массив определенного типа (указанного в generic). По умолчанию размер этого внутреннего массива будет иметь размер 16 (при создании класса конструктором без параметров). Если пользователь добавит в ArrayList больше 16 элементов, ничего плохого не произойдет (в отличие от массивов, где будет выброшено ArrayIndexOutOfBoundsException исключение). В этом случае просто произойдет пересоздание внутреннего массива elementData, и это произойдет неявно для пользователя.

В случае если вы заранее знаете максимальное количество элементов в создаваемой коллекции, размер массива можно указать передав нужное значение в конструктор ArrayList. Такая программа не будет тратить ресурсы на пересоздание внутреннего массива и конечно же будет работать немного быстрее.

Конструкторы класса

У этого класса есть следующие конструкторы: 

  • ArrayList() - помогает создать пустую коллекцию с внутренним массивом размер которого будет 16.
  • ArrayList(Collection <? extends Е> сollection) - создает коллекцию и заполняет ее элементами из передаваемой коллекции collection.
  • ArrayList(int capacity) - помогает создать пустую коллекцию с внутренним массивом, размер которого будет равен значению параметра capacity.

Из внутреннего устройства класса следуют его достоинства и недостатки. Рассмотрим их.

Достоинства класса ArrayList

  • Быстрый доступ по индексу. Скорость такой операции  - O(1).
  • Быстрая вставка и удаление элементов с конца. Скорость операций опять же - O(1).

Недостатки класса ArrayList

  • Медленная вставка и удаление элементов из середины. Такие операции имеют сложность O(n). Поэтому, если вы понимаете, что вам придется выполнять достаточно много операций такого типа, может быть лучше выбрать другой класс.

3. Добавления элементов в класс ArrayList

Для удобства в следующем списке приведены все методы, позволяющие добавлять элементы в объект класса ArrayList

  1. boolean add(E obj) - добавляет obj к вызывающей коллекции. Возвращает true, если obj был добавлен к коллекции. (Интерфейс Collection)
  2. void add(int index, Е obj) - вставляет obj в вызывающий список в позицию, указанную в index. Любые ранее вставленные элементы за указанной позицией вставки смещаются вверх. То есть никакие элементы не перезаписываются. (Интерфейс List)
  3. Е set (int index, Е obj) - присваивает obj элементу, находящемуся в списке в позиции index. (Интерфейс List)
  4. boolean addAll (Collection<? extends Е> с) - добавляет все элементы к вызывающей коллекции. Возвращает true, если операция удалась (то есть все элементы добавлены). В противном случае возвращает false. (Интерфейс Collection)

В следующем примере рассмотрим создание объекта класса ArrayList и добавление в него элементов с помощью указанных выше методов:

import java.util.ArrayList;
import java.util.List;

public class ArrayListAddDemo {
    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<>();

        System.out.println("Начальный размер arrayList: "
                + arrayList.size());

        arrayList.add("C");
        arrayList.add("A");
        arrayList.add("E");
        arrayList.add("B");
        arrayList.add("D");
        arrayList.add("F");
        arrayList.add("F");
        arrayList.add(1, "A2");
        arrayList.set(0, "C2");

        System.out.println("Размер arrayList после добавления: "
                + arrayList.size());
        System.out.println("Содержимое arrayList: " + arrayList);
        System.out.println(arrayList.get(0));
    }
}

4. Методы класса ArrayList для удаления элементов

Для удобства в следующем списке приведены все методы, позволяющие удалять элементы из объекта класса ArrayList

  1. boolean remove(Object obj) - удаляет один экземпляр obj из вызывающей коллекции. Возвращает true, если элемент удален. В противном случае возвращает false. (Интерфейс Collection)
  2. Е remove(int index) - удаляет элемент из вызывающего списка в позиции index и возвращает удаленный элемент. Результирующий список уплотняется, то есть элементы, следующие за удаленным, сдвигаются на одну позицию назад. (Интерфейс List)
  3. boolean removeAll(Collection<?> с) - удаляет все элементы из вызывающей коллекции. Возвращает truе, если в результате коллекция изменяется (то есть элементы удалены). В противном случае возвращает false. (Интерфейс Collection)
  4. boolean retainAll(Collection<?> с) - удаляет все элементы кроме входящих из вызывающей коллекции. Возвращает true, если в результате коллекция изменяется (то есть элементы удалены). В противном случае возвращает false. (Интерфейс Collection)
  5. void clear() - удаляет все элементы вызывающей коллекции. (Интерфейс Collection)

5. Пример удаления элементов из ArrayList

public class ArrayListRemoveDemo {
    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<>();

        arrayList.add("C");
        arrayList.add("A");
        arrayList.add("E");
        arrayList.add("B");
        arrayList.add("D");
        arrayList.add("F");
        arrayList.add("F");
        arrayList.add(1, "A2");
        arrayList.set(0, "C2");

        System.out.println("Содержимое arrayList: " + arrayList);
        System.out.println("Размер arrayList после добавления: "
                + arrayList.size());

        arrayList.remove("F");
        arrayList.remove(2);

        System.out.println("Размер arrayList после удаления: "
                + arrayList.size());
        System.out.println("Содержимое of arrayList: " + arrayList);
    }
}

6. Пример использования метода removeAll() класса ArrayList

import java.util.ArrayList;
import java.util.List;

public class ArrayListRemoveAllDemo {
    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<>();

        arrayList.add("C");
        arrayList.add("A");
        arrayList.add("E");
        arrayList.add("B");
        arrayList.add("D");
        arrayList.add("F");
        arrayList.add("F");
        arrayList.add(1, "A2");
        arrayList.set(0, "C2");

        List<String> removeElements = List.of("C2", "A2", "AA", "F");
        System.out.println("Содержимое arrayList до removeAll: "
                + arrayList);

        arrayList.removeAll(removeElements);
        System.out.println("Содержимое arrayList после removeAll: "
                + arrayList);
    }
}

7. Пример использования методов addAll(), clear() класса ArrayList

public class ArrayListDemo2 {
    public static void main(String[] args) {
        List<String> arrayList1 = new ArrayList<>();
        List<String> arrayList2 = List.of("1", "2");

        arrayList1.add("A");
        arrayList1.add("B");
        arrayList1.add("C");
        arrayList1.add("D");
        arrayList1.add("E");
        arrayList1.add("F");
        System.out.println("arrayList1 до добавления " + arrayList1);

        arrayList1.addAll(3, arrayList2);
        System.out.println("arrayList1 после добавления " + arrayList1);

        arrayList1.clear();
        System.out.println("arrayList1 после очистки " + arrayList1);
    }
}

8. Пример использования метода retainAll() класса ArrayList

import java.util.ArrayList;
import java.util.List;

public class ArrayListRetainAllDemo {
    public static void main(String[] args) {
        List<String> arrayList1 = new ArrayList<>();
        List<String> arrayList2 = List.of("F", "FF", "E");

        arrayList1.add("A");
        arrayList1.add("A");
        arrayList1.add("B");
        arrayList1.add("C");
        arrayList1.add("D");
        arrayList1.add("E");
        arrayList1.add("F");
        arrayList1.add("F");

        arrayList1.retainAll(arrayList2);
        System.out.println(arrayList1);
    }
}

9. Получение массива из ArrayList

Достаточно частая задача - это получение массива из коллекции. Для этого в интерфейсе Collection объявлен метод toArray(). Имеются два варианта метода toArray():

  • Object [] toArray()- создает массив типа Object и записывает в него значения из вызывающей коллекции:
    import java.util.Arrays;
    import java.util.List;
    
    public class ArrayListToStringDemo {
        public static void main(String[] args) {
            List<String> arrayList = List.of("C", "A", "E", "B", "D", "F");
            Object[] objectArray = arrayList.toArray();
            System.out.println(Arrays.toString(objectArray));
        }
    }

    Такой вариант не очень удобен тем, что массив имеет тип Object. Поэтому чаще используется следующий перегруженный вариант.

  • <Т> Т [] toArray(Т массив[])- создает массив такого же типа, как и вызывающая коллекция. Этот метод имеет два варианта использования. Первый вариант: можно создать массив такого же типа, как и вызывающая коллекция и передать этот массив в метод toArray(). И второй вариант: в метод передается массив того же типа, что и вызывающей коллекции, но размером 0. Метод создает новый массив и записывает в него значения из коллекции. Смотрим пример:
import java.util.Arrays;
import java.util.List;

public class ArrayListToStringDemo {
    public static void main(String[] args) {
        List<String> arrayList = List.of("C", "A", "E", "B", "D", "F");
        //1 вариант
        String[] stringArray1 = new String[arrayList.size()];
        arrayList.toArray(stringArray1);
        System.out.println(Arrays.toString(stringArray1));

        //2 вариант
        String[] stringArray2 = arrayList.toArray(new String[0]);
        System.out.println(Arrays.toString(stringArray2));
    }
}
Read also:
Trustpilot
Trustpilot
Comments