Usando uma ArrayList
ArrayList tem muitos métodos, mas você só precisa conhecer um punhado deles - ainda menos do que você fez para String e StringBuilder .
Antes de ler mais, você verá algo novo nas assinaturas do método: uma “classe” chamada E . Não se preocupe - não é realmente uma classe. E é usado por convenção em genéricos significa "qualquer classe que este array possa conter". Se você não especificou um tipo ao criar o ArrayList , E significa Object. Caso contrário, significa a classe que você colocou entre < e >.
Você também deve saber que ArrayList implementa toString() para que você possa ver facilmente conteúdo apenas imprimindo. Arrays não produzem uma saída tão bonita.
add()
Os métodos add () inserem um novo valor no ArrayList. As assinaturas do método são as seguintes:
boolean add(E element)
void add(int index, E element)
Não se preocupe com o valor de retorno booleano. Isso sempre retorna true. Está lá porque outras classes na família de coleções precisam de um valor de retorno na assinatura ao adicionar um elemento.
Como add() é o método ArrayList mais importante que você precisa saber para o exame, nós vamos mostrar alguns conjuntos de exemplos para isso. Vamos começar com o caso mais simples:
ArrayList list = new ArrayList();
list.add("hawk"); // [hawk]
list.add(Boolean.TRUE); // [hawk, true]
System.out.println(list); // [hawk, true]
add () faz exatamente o que esperamos: armazena o String no ArrayList que não está mais vazio. Em seguida, faz a mesma coisa para o booleano. Tudo bem porque nós não especificamos um tipo para o ArrayList; portanto, o tipo é Object, que inclui tudo exceto primitivos. Pode não ter sido o que pretendíamos, mas o compilador não sabe. Agora, vamos usar genéricos para dizer ao compilador que queremos apenas permitir objetos String em nossa ArrayList :
ArrayList safer = new ArrayList<>();
safer.add("sparrow");
safer.add(Boolean.TRUE); // DOES NOT COMPILE
Desta vez, o compilador sabe que somente objetos String são permitidos e evita que tente adicionar um booleano. Agora vamos tentar adicionar vários valores para diferentes posições.
4: List birds = new ArrayList<>();
5: birds.add("hawk"); // [hawk]
6: birds.add(1, "robin"); // [hawk, robin]
7: birds.add(0, "blue jay"); // [blue jay, hawk, robin]
8: birds.add(1, "cardinal"); // [blue jay, cardinal, hawk, robin]
9: System.out.println(birds); // [blue jay, cardinal, hawk, robin]
Quando uma questão tem código que adiciona objetos em posições indexadas, desenhe-a para que você não perderá o controle de qual valor está em qual índice. Neste exemplo, a linha 5 adiciona "hawk" ao fim de birds. Em seguida, a linha 6 adiciona "robin" ao índice 1 de birds, que é o final. A linha 7 adiciona "blue jay" ao índice 0, que é o começo de birds. Finalmente, a linha 8 adiciona "cardinal " ao índice 1, que agora está próximo ao meio dos birds.
remove()
Os métodos remove () removem o primeiro valor correspondente do ArrayList ou removem o elemento em um índice especificado. As assinaturas do método são as seguintes:
boolean remove(Object object)
E remove(int index)
Desta vez, o valor de retorno booleano nos diz se uma correspondência foi removida. O retorno E type é o elemento que realmente foi removido. A seguir mostra como usar esses métodos:
3: List birds = new ArrayList<>();
4: birds.add("hawk"); // [hawk]
5: birds.add("hawk"); // [hawk, hawk]
6: System.out.println(birds.remove("cardinal")); // prints false
7: System.out.println(birds.remove("hawk")); // prints true
8: System.out.println(birds.remove(0)); // prints hawk
9: System.out.println(birds); // []
A linha 6 tenta remover um elemento que não está em birds. Ele retorna falso porque não existe o elemento. A linha 7 tenta remover um elemento que está em birds e, portanto, retorna true.
Observe que remove apenas uma correspondência. A linha 8 remove o elemento no índice 0, que é o último elemento restante na ArrayList.
Como chamar remove () com um int usa o índice, um índice que não existe irá lançar uma exceção. Por exemplo, birds.remove (100) lança um IndexOutOfBoundsException .
Existe também um método removeIf (). Nós vamos cobri-lo no próximo capítulo porque ele usa expressões lambda (um tópico nesse capítulo).
set()
O método set () altera um dos elementos do ArrayList sem alterar o tamanho.
A assinatura do método é a seguinte:
E set(int index, E newElement)
O tipo de retorno E é o elemento que foi substituído. O código seguinte mostra como usar este método:
15: List birds = new ArrayList<>();
16: birds.add("hawk"); // [hawk]
17: System.out.println(birds.size()); // 1
18: birds.set(0, "robin"); // [robin]
19: System.out.println(birds.size()); // 1
20: birds.set(1, "robin"); // IndexOutOfBoundsException
A linha 16 adiciona um elemento ao array, fazendo o tamanho 1. A linha 18 substitui aquele elemento e o tamanho permanece em 1. A linha 20 tenta substituir um elemento que não está na ArrayList.
Como o tamanho é 1, o único índice válido é 0. O Java lança uma exceção porque isso não é permitido.
isEmpty() e size()
Os métodos isEmpty () e size () examinam quantos slots estão em uso. As assinaturas dos método são as seguintes:
boolean isEmpty()
int size()
A seguir como usar esses métodos:
System.out.println(birds.isEmpty()); // true
System.out.println(birds.size()); // 0
birds.add("hawk"); // [hawk]
birds.add("hawk"); // [hawk, hawk]
System.out.println(birds.isEmpty()); // false
System.out.println(birds.size()); // 2
No começo, birds têm um tamanho de 0 e está vazia. Tem uma capacidade que é maior de 0. No entanto, como com StringBuilder, não usamos a capacidade de determinar o tamanho ou comprimento. Depois de adicionar elementos, o tamanho se torna positivo e não está mais vazio.
clear()
O método clear() fornece uma maneira fácil de descartar todos os elementos da ArrayList. A assinatura do método é a seguinte:
void clear()
O código seguinte mostra como usar este método:
List birds = new ArrayList<>();
birds.add("hawk"); // [hawk]
birds.add("hawk"); // [hawk, hawk]
System.out.println(birds.isEmpty()); // false
System.out.println(birds.size()); // 2
birds.clear(); // []
System.out.println(birds.isEmpty()); // true
System.out.println(birds.size()); // 0
Depois que chamamos clear () , as birds voltam a ser um ArrayList vazia de tamanho 0.
contains()
O método contains () verifica se um determinado valor está na ArrayList . O método assinatura é a seguinte:
boolean contains(Object object)
O seguinte código mostra como usar este método:
List birds = new ArrayList<>();
birds.add("hawk"); // [hawk]
System.out.println(birds.contains("hawk")); // true
System.out.println(birds.contains("robin")); // false
Este método chama equals() em cada elemento do ArrayList para ver se existem quaisquer jogos. Como String implementa equals (), isso funciona bem.
equals()
Finalmente, ArrayList tem uma implementação customizada de equals() para que você possa comparar duas listas para ver se eles contêm os mesmos elementos na mesma ordem.
boolean equals(Object object)
O seguinte código mostra um exemplo:
31: List one = new ArrayList<>();
32: List two = new ArrayList<>();
33: System.out.println(one.equals(two)); // true
34: one.add("a"); // [a]
35: System.out.println(one.equals(two)); // false
36: two.add("a"); // [a]
37: System.out.println(one.equals(two)); // true
38: one.add("b"); // [a,b]
39: two.add(0, "b"); // [b,a]
40: System.out.println(one.equals(two)); // false
Na linha 33, os dois objetos ArrayList são iguais. Uma lista vazia é certamente a mesma com elementos na mesma ordem. Na linha 35, os objetos ArrayList não são iguais porque o tamanho é diferente. Na linha 37, eles são iguais novamente porque o mesmo elemento está em cada um. Na linha 40, eles não são iguais. O tamanho é o mesmo e os valores são os mesmos, mas não estão na mesma ordem.