1. Como ArrayList
está estruturado
ArrayList
é a classe Java mais comumente usada para armazenar elementos. Então, como funciona ArrayList
e por que todo mundo gosta tanto?
A estrutura de ArrayList
é simples e engenhosa. Cada ArrayList
objeto contém dois campos:
- Uma matriz de elementos
- Uma
size
variável, que armazena o número de elementos na lista
Internamente, um ArrayList
objeto 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 size
variável é 0.
Se você adicionar um elemento à lista, ele será armazenado na 0ª célula do array e size
aumentará para 1.
Se você adicionar mais um elemento, ele será armazenado na 1ª célula e size
aumentará 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:
- Uma nova matriz é criada com uma vez e meia o comprimento da anterior
- Todos os elementos do array antigo são copiados para o novo array.
- No
ArrayList
objeto, uma referência ao novo array substitui a referência ao antigo . - O elemento passado é salvo na décima célula do novo array.
- 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:
Temos um ArrayList
objeto que contém dois campos (duas variáveis): um container (o data
array) e o número de elementos armazenados ( size
). A data
variá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:
A matriz agora armazena o elemento 5 e size == 1
.
Se alguém chamar o size()
método em nosso ArrayList
objeto 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 ArrayList
objeto. Estes são e sempre serão os ArrayList
dados internos do.
Vamos adicionar mais 7 números à lista: 10, 20, 30, 40, 50, 60, 70.
Agora a memória ficará assim:
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.
Há uma simplificação excessiva nesta imagem.
A ArrayList
classe não pode armazenar tipos primitivos, portanto, usa o Integer
tipo 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 Integer
objetos. 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:
Decidimos adicionar o número 100 a ele. Isso é o que acontece no add()
método:
Etapa 1 — Crie uma nova matriz:
Passo 2 — Copie todos os elementos do array antigo para o novo:
Passo 3 — Substitua o array antigo (altere a referência ao ArrayList
array interno do objeto):
Etapa 4 — Adicione o novo número, que é o que trabalhamos tanto para conseguir:
GO TO FULL VERSION