"Aqui estou."

"Oi, Ellie!"

"Hoje vamos falar sobre um assunto interessante. Vou falar sobre a classe ArrayList ."

"Uma nova classe? Legal! O que ela pode fazer?"

"Deixe-me começar com a história por trás. A única coisa que os programadores não gostam nos arrays é que você não pode alterar seu tamanho. O que você faz se precisar adicionar mais três elementos a um array que tem apenas um slot livre? "

"A única solução para este problema é criar arrays muito grandes, a fim de garantir que você tenha espaço suficiente para todos os elementos. No entanto, isso geralmente significa desperdício de memória. Se um array geralmente contém três elementos, mas há até mesmo a menor chance que pode precisar acomodar 100 elementos, você deve criar uma matriz de 100 elementos."

"Então, o que os programadores inventaram?"

"Eles escreveram a classe ArrayList , que faz a mesma coisa que um Array, mas pode mudar seu tamanho."

"Movimento interessante. Como eles fizeram isso?"

"Todo objeto ArrayList armazena um array regular de elementos. Quando você lê elementos de um ArrayList , ele os lê de seu array interno. Quando você os escreve no ArrayList , ele os grava em seu array interno. Aqui, compare estas colunas:"

Variedade ArrayList
Criar um contêiner para elementos
String[] list = new String[10];
ArrayList<String> list = new ArrayList<String>();
Obter o número de elementos
int n = list.length;
int n = list.size();
Obter um elemento de uma matriz/coleção
String s = list[3];
String s = list.get(3);
Escrever um elemento em um array
list[3] = s;
list.set(3, s);

"Então, por que o ArrayList é melhor? Tanto quanto eu posso dizer, o código agora é mais longo."

"Primeiro, o ArrayList oferece suporte a várias operações adicionais que os programadores precisam executar o tempo todo. Um array comum não oferece suporte a essas operações. Por exemplo, inserir ou excluir elementos do meio de um array sem deixar buracos. "

"Em segundo lugar, a capacidade de alterar o tamanho do array. Quando você precisa adicionar mais um elemento, mas o array interno não possui slots livres, aqui está o que acontece dentro do ArrayList :

a) Outra matriz é criada 50% maior que a matriz interna atual, mais um elemento.

b) Todos os elementos do array antigo são copiados para o novo.

c) O novo array é salvo como o array interno do objeto ArrayList. A matriz antiga é declarada como lixo (simplesmente paramos de armazenar uma referência a ela)."

Variedade ArrayList
Adicione um elemento no final da matriz
Esta ação não é suportada
list.add(s);
Adicione um elemento no meio da matriz
Esta ação não é suportada
list.add(15, s);
Adicione um elemento no início da matriz
Esta ação não é suportada
list.add(0, s);
Excluir um elemento da matriz
Poderíamos deletar um elemento com list[3] = null. Mas isso deixaria um 'buraco' na matriz.
list.remove(3);

"Como trabalhamos com este ArrayList?"

"Na verdade, exatamente como fazemos com um array comum. Veja. Vamos comparar o trabalho com um ArrayList com o trabalho com um array. Suponha que precisamos 'ler 10 strings e exibi-los na tela em ordem inversa '."

"Veja isso:

Com uma matriz
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

// Display the contents of the array
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
Com uma ArrayList
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
ArrayList&ltString> list = new ArrayList&ltString>();
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

// Display the contents of the collection
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

Usei a mesma cor para destacar ações semelhantes em cada coluna."

"Por um lado, tudo é diferente. Por outro, ainda é o mesmo."

"Certo. Exceto que não usamos colchetes ao trabalhar com um ArrayList . Em vez disso, usamos os métodos get , set e add ."

"Sim, eu percebi isso. Ainda assim, parece muito o mesmo."