1. Como ArrayListestá estruturado

ArrayListé a classe Java mais comumente usada para armazenar elementos. Então, como funciona ArrayListe por que todo mundo gosta tanto?

A estrutura de ArrayListé simples e engenhosa. Cada ArrayListobjeto contém dois campos:

  • Uma matriz de elementos
  • Uma sizevariável, que armazena o número de elementos na lista

Internamente, um ArrayListobjeto contém um array muito comum! Mas isso não é tudo. Há também uma variável de tamanho , que armazena o comprimento da lista. É assim que funciona:

Inicialmente, o comprimento do array dentro da lista é 10. E a sizevariável é 0.

Se você adicionar um elemento à lista, ele será armazenado na 0ª célula do array e sizeaumentará para 1.

Se você adicionar mais um elemento, ele será armazenado na 1ª célula e sizeaumentará novamente em 1 e se tornará igual a dois.

Se você adicionar outro elemento quando não houver mais espaço no array, acontecerá o seguinte no add()método:

  1. Uma nova matriz é criada com uma vez e meia o comprimento da anterior
  2. Todos os elementos do array antigo são copiados para o novo array.
  3. No ArrayListobjeto, uma referência ao novo array substitui a referência ao antigo .
  4. O elemento passado é salvo na décima célula do novo array.
  5. A variável de tamanho aumenta em 1 e agora será igual a 11

Algo semelhante acontece ao adicionar (inserir) um elemento no meio da lista. Os elementos existentes são deslocados em 1 para a direita e o elemento passado é gravado na célula recém-liberada do array.

Agora vamos considerar os cenários mais básicos envolvendo listas:


2. Adicionar um elemento a umArrayList

Vamos dar uma olhada no que acontece dentro da lista quando elementos são adicionados a ela. Imediatamente após a criação de um objeto ArrayList, temos algo assim na memória:

Adicionando um elemento a um ArrayList

Temos um ArrayListobjeto que contém dois campos (duas variáveis): um container (o dataarray) e o número de elementos armazenados ( size). A datavariável armazena uma referência a um contêiner (array) que pode armazenar 10 elementos.

Se decidirmos adicionar o número 5 ao array, obtemos a seguinte imagem:

Adicionando um elemento a um ArrayList 2

A matriz agora armazena o elemento 5 e size == 1.

Se alguém chamar o size()método em nosso ArrayListobjeto agora, o valor de retorno será o número de elementos armazenados na lista: 1. O número de elementos na lista não é igual à capacidade de armazenamento do array.

Nem a capacidade de armazenamento atual nem o próprio array estarão acessíveis (visíveis) fora do ArrayListobjeto. Estes são e sempre serão os ArrayListdados internos do.

Vamos adicionar mais 7 números à lista: 10, 20, 30, 40, 50, 60, 70.

Agora a memória ficará assim:

Adicionando um elemento a um ArrayList

Se você chamar o size()método agora, ele retornará o número 8, que é o novo número de elementos da lista. Este valor não tem nada a ver com o tamanho do array interno.

Importante:

Há uma simplificação excessiva nesta imagem.

A ArrayListclasse não pode armazenar tipos primitivos, portanto, usa o Integertipo em vez de int. O contêiner não armazena diretamente os valores {5, 10, 20, 30, 40, 50, 60, 70}, mas sim referências a Integerobjetos. Todas as células vazias no contêiner armazenam null.



3. Aumentando o comprimento de uma lista

Vamos dar uma olhada no que acontece dentro de uma lista quando não há mais células vazias em seu array interno.

Suponha que temos uma lista de 10 elementos:

Aumentando o comprimento de uma lista

Decidimos adicionar o número 100 a ele. Isso é o que acontece no add()método:

Etapa 1 — Crie uma nova matriz:

Aumentando o comprimento de uma lista 2

Passo 2 — Copie todos os elementos do array antigo para o novo:

Aumentando o comprimento de uma lista 2

Passo 3 — Substitua o array antigo (altere a referência ao ArrayListarray interno do objeto):

Aumentando o comprimento de uma lista 3

Etapa 4 — Adicione o novo número, que é o que trabalhamos tanto para conseguir:

Aumentando o comprimento de uma lista 4