JavaRush /Blogue Java /Random-PT /ArrayList em Java

ArrayList em Java

Publicado no grupo Random-PT
Durante o desenvolvimento, muitas vezes é difícil prever o tamanho dos arrays necessários. Portanto, a função de alocar memória dinamicamente enquanto o programa está em execução é necessária para toda linguagem de programação. Um array dinâmico é aquele cujo tamanho pode mudar durante a execução do programa. Em Java, existe uma classe ArrayList para essa finalidade .

O que é a classe ArrayList?

ArrayList é uma implementação de array mutável da interface List, parte do Collection Framework, que é responsável pela lista (ou array dinâmico) localizada no pacote java.utils. Esta classe implementa todas as operações de lista opcionais e fornece métodos para controlar o tamanho do array usado para armazenar a lista. ArrayList é baseado na ideia de um array dinâmico. Ou seja, a capacidade de adicionar e remover elementos, aumentando ou diminuindo conforme necessário.

O que ArrayList armazena?

Apenas faça referência a tipos, quaisquer objetos, incluindo classes de terceiros. Strings, fluxos de saída, outras coleções. As classes wrapper são usadas para armazenar tipos de dados primitivos.

Construtores ArrayList

  1. ListaArray()

    Construtor vazio com capacidade inicial do array interno = 10.

    ArrayList<String> list = new ArrayList<>();

    É aconselhável indicar o tipo de valores armazenados entre colchetes angulares. No exemplo acima - String.

  2. ArrayList(Coleção <? estende E> c)

    O construtor aceita outra coleção, criando um novo array com os elementos da coleção passada:

    ArrayList<String> list2 = new ArrayList<>(list);

    A ordem dos elementos na nova lista será a mesma da original.

  3. ArrayList(int capacidadeinicial)

    O parâmetro construtor é o valor do tamanho inicial do array interno.

    ArrayList<String> list2 = new ArrayList<>(10000);

    Se o ArrayList subjacente ficar sem espaço quando novos elementos forem adicionados, um novo array maior será criado e os dados serão copiados para ele. Se você souber antecipadamente, ao escrever seu código, que um grande número de elementos será processado no array, deverá especificar um valor maior para fins de otimização.

Métodos ArrayList

    Abaixo estão os principais métodos de ArrayList.

  • adicionar (E e)

    Adiciona um novo elemento ao final da lista. Retorna boolean-valor ( verdadeiro - sucesso, falso - não adicionado):

    ArrayList<String> list = new ArrayList<>();
    list.add("Hello");
  • adicionar (índice int, elemento E)

    Adiciona um elemento elementno índice de posição. Ao adicionar, todos os elementos à direita do índice especificado são deslocados 1 posição para a direita:

    list.add(0, "Amigo");

    Muito útil quando você precisa inserir um elemento em qualquer lugar de uma lista, mas para operações de inserção frequentes no início e no meio do ArrayList pode não ser uma escolha muito boa - você deve procurar no LinkedList.

  • addAll(Coleção <? estende E> coleção)

    Adiciona todos os elementos da coleção a uma lista na ordem em que aparecem na coleção.

  • addAll(índice int, coleção <? estende E> coleção)

    Добавление всех элементов 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 or index >= максимального количества элементов списка, будет выброшено исключение 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
Os métodos ArrayList em Java são aprendidos no curso JavaRush. O primeiro conhecimento ocorre no sétimo nível da missão Java Syntax, na palestra “ArrayList Class” . No mesmo nível, existem coleções de tarefas - um e dois , nas quais você precisa usar métodos ArrayList, são fornecidos exemplos adicionais de trabalho com ArrayList e genéricos e a diferença entre ArrayList e LinkedList é explicada. Este é um extenso tópico de estudo, portanto, de uma forma ou de outra, Arraylist em Java (os métodos desta classe são apenas parte de todo o corpo de conhecimento que vale a pena aprofundar) é retornado no curso nos seguintes níveis de treinamento - Core, Collections, Multithreading. Acreditamos que a prática diária de escrever código é a principal chave para o sucesso na programação. Portanto, 80% do JavaRush consiste em tarefas práticas, miniprojetos e tarefas de jogos. Tudo isso são centenas de horas de codificação que ajudarão a melhorar suas habilidades.

Links para leitura adicional

  1. Um artigo detalhado sobre arrays dinâmicos , ou mais precisamente sobre ArrayListe LinkedList, que desempenham seu papel na linguagem Java.
  2. Um artigo sobre como remover elementos de um ArrayList .
  3. Palestra sobre como trabalhar com ArrayList em diagramas e imagens .
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION