- Aprender
- Computação e TI
- Programação
- Programação orientada a objetos com Java
- Listas e vetores em Java
Listas, vetores e cadeias de caracteres em Java
BásicoAula 4 de 11 do curso Curso de Programação orientada a objetos com Java
O que você vai aprender
- Crie ArrayLists, adicione, leia, substitua e remova elementos, verifique o conteúdo de uma lista e compreenda o que acontece quando uma lista é compartilhada ou passada para um método.
- Crie uma lista e trabalhe com os elementos por índiceImporte e crie um ArrayList, adicione elementos, leia e substitua-os por índice e mantenha-se dentro do intervalo válido de índices.
- Remova elementos e verifique o conteúdo de uma listaRemova elementos por índice ou por valor, encontre valores com contains e indexOf e evite as armadilhas das listas de Integer e dos índices que mudam.
- Compartilhe listas entre variáveis e métodosExplique o que uma variável de lista armazena, o que acontece quando uma lista é atribuída ou passada para um método, como copiá-la e como comparar duas listas.
- Crie uma lista e trabalhe com os elementos por índice
- Crie vetores, leia e escreva seus elementos, passe-os e copie-os corretamente e escolha entre um vetor e um ArrayList.
- Crie vetores e acesse seus elementosDeclare e crie vetores, preencha-os, leia e escreva elementos por índice e conheça seu comprimento, seus valores padrão e como imprimi-los.
- Passe, copie e compare vetores e escolha entre vetores e listasExplique referências a vetores, copie e compare vetores corretamente, troque elementos e decida quando um vetor ou um ArrayList atende à tarefa.
- Crie vetores e acesse seus elementos
- Visite cada elemento com laços com índice e laços for-each, calcule totais, médias e valores extremos, busque valores e altere uma lista com segurança durante seu percurso.
- Percorra listas e vetores com for e for-eachEscreva laços com índice e laços for-each sobre listas, vetores e caracteres de uma cadeia de caracteres e escolha o laço adequado para a tarefa.
- Calcule totais, médias, contagens e valores extremosUse variáveis acumuladoras para calcular somas, médias, contagens, máximos e mínimos e construa uma lista filtrada.
- Busque um valor em uma lista ou vetorEscreva buscas sequenciais que retornem uma posição, uma resposta sim ou não ou todas as correspondências, e busque por uma condição em vez de um valor exato.
- Altere uma lista com segurança durante seu percursoRemova ou adicione elementos durante um laço sem pular elementos ou causar uma exceção e escolha uma maneira segura de fazê-lo.
- Percorra listas e vetores com for e for-each
- Trate uma cadeia de caracteres como uma sequência de caracteres, localize e extraia trechos, limpe seu conteúdo e transforme linhas de texto em dados e vice-versa.
- Leia os caracteres de uma cadeia de caracteresUse length e charAt, percorra caracteres, trabalhe com valores char, una texto com + e compreenda que cadeias de caracteres não podem ser alteradas.
- Localize, extraia e limpe trechos de uma cadeia de caracteresLocalize texto com indexOf e contains, extraia trechos com substring e altere maiúsculas, minúsculas, espaços e conteúdo com replace, trim e métodos relacionados.
- Divida texto em partes e converta texto em númerosDivida uma linha em campos com split, converta campos em números e números em texto, verifique as partes e una-as novamente.
- Leia os caracteres de uma cadeia de caracteres
- Compare cadeias de caracteres por conteúdo e por ordem alfabética e use StringBuilder para construir e editar texto passo a passo.
- Compare cadeias de caracteres com equals e compareToUse equals e equalsIgnoreCase para testar o conteúdo, evite a armadilha de == e erros com null e use compareTo para ordenar cadeias de caracteres.
- Construa e edite texto com StringBuilderUse StringBuilder para construir texto em um laço e editá-lo no próprio objeto, converta o resultado em uma String e evite os erros comuns com StringBuilder.
- Compare cadeias de caracteres com equals e compareTo
Guia de estudo de Listas e vetores em Java
1Armazene e gerencie dados em um ArrayList
Um ArrayList mantém valores relacionados em uma coleção ordenada, mesmo quando você não conhece a quantidade final. Comece pela criação de uma lista com tipo definido e avance até inserir, substituir, remover e encontrar elementos por índice ou valor. Depois, acompanhe o que acontece quando duas variáveis ou um método compartilham essa lista, para escolher entre alterar dados existentes e criar um resultado separado.
1.1 Crie e edite um ArrayList
Um ArrayList armazena valores em ordem. Ele cresce quando você adiciona um elemento e diminui quando remove um. Cada elemento tem um índice, que começa em 0. Importe a classe antes de usá-la: import java.util.ArrayList;.
Crie uma lista com tipo definido
ArrayList<String> drinks = new ArrayList<>();
drinks.add("tea");
drinks.add("milk");
O tipo dentro de <String> indica o que a lista armazena. O diamante <> à direita permite que Java infira esse mesmo tipo. A lista começa vazia, com tamanho 0; após essas duas chamadas, contém [tea, milk] e tem tamanho 2. Imprimir a lista diretamente mostra seus elementos: System.out.println(drinks);.
O tipo dos elementos de uma lista deve ser um tipo de classe. Para números, use uma classe empacotadora: Integer para int, Double para double, Boolean para boolean ou Character para char. ArrayList<int> não compila. Com ArrayList<Integer> numbers = new ArrayList<>();, numbers.add(5) funciona porque Java empacota o int em um Integer. Lê-lo em int n = numbers.get(0); desempacota o valor.
Acompanhe cada mudança de índice
String old = drinks.set(0, "coffee");
drinks.add(1, "water");
String last = drinks.get(2);
set(0, "coffee") substitui o primeiro elemento e retorna o valor antigo, então old é "tea". O tamanho continua 2. Inserir "water" no índice 1 desloca "milk" para a direita. A lista agora é [coffee, water, milk]; last é "milk" e o tamanho é 3.
| Tarefa | Chamada | Índice válido |
|---|---|---|
| Ler um elemento | get(i) | 0 até size() - 1 |
| Substituir um elemento | set(i, value) | 0 até size() - 1 |
| Inserir um elemento | add(i, value) | 0 até size() |
| Acrescentar um elemento | add(value) | Não precisa de índice |
O índice adicional permitido para inserção é a posição logo após o último elemento atual. Nessa lista, add(3, "juice") acrescenta ao final, mas get(3) falharia antes dessa inserção. Um índice inválido causa uma IndexOutOfBoundsException. Use get(size() - 1) para o último elemento, depois de verificar que a lista não está vazia.
Comece com dados ou colete entradas
Com import java.util.List;, new ArrayList<>(List.of("red", "green", "blue")) cria uma lista modificável contendo esses valores. List.of(...) sozinho cria uma lista não modificável: add, set e remove lançam UnsupportedOperationException. Você também verá List<String> names = new ArrayList<>();; a variável do tipo geral List continua oferecendo esses métodos de lista.
Para coletar linhas até uma linha vazia, use um Scanner chamado scanner e uma lista vazia chamada lines:
while (true) {
String line = scanner.nextLine();
if (line.isEmpty()) {
break;
}
lines.add(line);
}
A linha que encerra a entrada é verificada antes da adição, portanto não é armazenada. lines.size() conta as linhas armazenadas. lines.isEmpty() testa se não há nenhuma, e lines.clear() remove todas quando você precisa reutilizar a lista.
Principais conclusões
- Os índices começam em 0; o último elemento está em
size() - 1. setsubstitui;addcom índice insere e desloca os elementos seguintes.- Use tipos empacotadores como
Integerem um ArrayList. - Copie
List.of(...)para um ArrayList quando a lista precisar ser alterada. clear()remove todos os elementos; uma lista vazia tem tamanho 0.
1.2 Remova valores e encontre suas posições
Remover um elemento altera tanto o tamanho quanto os índices dos elementos seguintes. Uma busca informa se um valor existe ou onde ele está agora. Mantenha clara a diferença entre um valor e sua posição, especialmente em uma lista de inteiros.
Dois significados de remove
| Chamada | Significado | Resultado retornado |
|---|---|---|
remove(int index) | Remove o elemento em uma posição | O elemento removido |
remove(Object value) | Remove o primeiro valor igual | true se removido; caso contrário, false |
Para [coffee, water, milk], remove(0) retorna "coffee" e deixa [water, milk]. O antigo índice 2 de "milk" agora é inválido; esse valor passou para o índice 1. Um índice guardado só é útil enquanto as alterações não mudarem as posições que ele descreve.
Remover por valor não significa remover todas as correspondências. Começando com [a, b, a], remove("a") deixa [b, a]. Uma segunda chamada remove o "a" restante. Remover um valor ausente retorna false e deixa a lista inalterada, então você pode usar o resultado diretamente:
boolean removed = names.remove("Lena");
if (removed) {
System.out.println("Name removed");
}
A armadilha da sobrecarga com inteiros
Um argumento int seleciona a forma por índice, mesmo quando a lista armazena inteiros:
ArrayList<Integer> numbers = new ArrayList<>(List.of(10, 20, 30));
int removed = numbers.remove(1);
boolean found = numbers.remove(Integer.valueOf(10));
A primeira chamada remove o índice 1, então removed é 20 e a lista passa a ser [10, 30]. A segunda chamada fornece explicitamente um objeto Integer. Ela remove o valor 10, torna found verdadeiro e deixa [30]. Chamar remove(10) na lista original de três elementos tentaria acessar o índice 10 e lançaria IndexOutOfBoundsException.
Escolha um resultado de busca
Para colors = [red, green, blue, green], contains("green") é true, indexOf("green") é 1 e lastIndexOf("green") é 3. contains fornece uma resposta sim ou não. Os dois métodos de índice fornecem a primeira ou a última posição correspondente. Um valor ausente produz false ou -1, respectivamente.
Esses métodos usam equals para comparar elementos. O conteúdo das cadeias de caracteres deve ser exatamente igual, inclusive quanto a maiúsculas e minúsculas: indexOf("Green") é -1 nessa lista. Para uma busca sem essa distinção, um laço pode comparar cada nome com equalsIgnoreCase.
Uma correspondência no índice 0 continua sendo uma correspondência. O teste indexOf(x) > 0 deixa de encontrá-la. Se você precisa da posição, teste explicitamente o marcador de ausência:
int index = colors.indexOf("red");
if (index != -1) {
colors.remove(index);
}
Aqui a busca retorna 0, o teste é satisfeito e remover o índice 0 deixa [green, blue, green]. Para evitar nomes duplicados, verifique antes de adicionar: if (!names.contains(name)) { names.add(name); }. Para remover todas as ocorrências, você pode repetir a remoção enquanto contains for verdadeiro ou usar um laço seguro em ordem inversa. Um laço em ordem direta que sempre incrementa após a remoção pode pular um elemento deslocado.
Principais conclusões
remove(index)retorna um elemento;remove(value)retorna um booleano.- Para um valor inteiro, use
remove(Integer.valueOf(x)). - A remoção desloca os elementos seguintes uma posição para a esquerda.
indexOfelastIndexOfretornam -1 para um valor ausente; 0 significa encontrado.- Buscas em cadeias de caracteres distinguem maiúsculas de minúsculas e comparam conteúdos.
- A remoção por valor remove apenas a primeira correspondência.
1.3 Compreenda listas compartilhadas e cópias
Uma variável de lista armazena uma referência a um objeto. Ela não armazena todos os elementos dentro da própria variável. Isso explica por que alterar uma lista por meio de um nome pode afetar outro nome e por que atribuir um valor a um parâmetro tem um efeito diferente de editar seus elementos.
Acompanhe as referências
ArrayList<String> original = new ArrayList<>(List.of("tea"));
ArrayList<String> alias = original;
ArrayList<String> copy = new ArrayList<>(original);
alias.add("milk");
copy.add("juice");
original e alias apontam para uma mesma lista. Após a adição por meio de alias, ambos mostram [tea, milk]. A cópia é uma lista separada, criada antes dessa adição, portanto contém [tea, juice]. Dois nomes para um objeto são apelidos de referência. A atribuição copia uma referência; o construtor de cópia cria uma nova lista e copia os elementos para ela.
A lista copiada contém referências aos mesmos objetos de elemento. Com cadeias de caracteres e valores empacotados, esses objetos não podem mudar, portanto substituir uma posição em uma lista não altera a posição da outra. Copiar uma lista é suficiente para que as duas adicionem, removam e substituam elementos independentemente.
Um método recebe uma cópia da referência
Java passa argumentos por valor. Para uma lista, esse valor é uma referência. A variável de quem chama o método e o parâmetro inicialmente apontam para a mesma lista:
static void addBonus(ArrayList<Integer> scores, int bonus) {
for (int i = 0; i < scores.size(); i++) {
scores.set(i, scores.get(i) + bonus);
}
}
Chamar addBonus(scores, 5) em [70, 85] altera a lista de quem chamou o método para [75, 90]. O método não precisa retornar uma lista porque edita o objeto compartilhado. Mas atribuir scores = new ArrayList<>(); dentro do método apenas redireciona seu parâmetro local. A variável de quem chamou o método continua apontando para a lista antiga.
Um parâmetro int recebe uma cópia do número. Alterá-lo não pode mudar a variável int de quem chamou o método. Nos dois casos, o parâmetro é local; a diferença é se seu valor leva a um objeto modificável compartilhado.
Retorne novos dados quando essa for a tarefa
static ArrayList<String> longWords(ArrayList<String> words, int minLength) {
ArrayList<String> result = new ArrayList<>();
for (String word : words) {
if (word.length() >= minLength) {
result.add(word);
}
}
return result;
}
O método lê words e escreve apenas em result, portanto a entrada permanece inalterada. Um método que altera um argumento deve comunicar esse comportamento, como addBonus faz. Um método que retorna novos dados facilita a verificação da saída separadamente da entrada.
Compare conteúdos e trate a ausência de resultados
a == b testa se duas referências de lista apontam para o mesmo objeto. a.equals(b) testa se os tamanhos são iguais e se os elementos são iguais e estão na mesma ordem. Duas listas [1, 2] construídas separadamente têm conteúdos iguais, mas identidades diferentes; [2, 1] não tem conteúdo igual na ordem da lista.
Uma lista vazia é um objeto real de tamanho 0. Um laço sobre ela é executado zero vezes, mas get(0) falha porque não há índices de elementos. null significa que não há objeto de lista; nesse caso, até size() lança NullPointerException. Um método sem correspondências pode retornar uma lista de resultado vazia, permitindo que quem o chama percorra o resultado normalmente.
Principais conclusões
- A atribuição compartilha uma lista;
new ArrayList<>(original)cria uma lista separada. - Um método pode editar a lista de quem o chamou por meio de uma referência copiada.
- Reatribuir um parâmetro não redireciona a variável de quem chamou o método.
equalsde listas compara conteúdos ordenados;==compara identidade.- Uma lista vazia permite iteração;
nullnão se refere a nenhuma lista.
2Armazene dados de tamanho fixo em vetores
Vetores dão a cada valor uma posição numerada em uma estrutura cujo comprimento permanece fixo. Crie e preencha essas posições, leia seus valores padrão e imprima seus conteúdos com clareza. Copiar, comparar, trocar e passar vetores para métodos depende de compreender quais variáveis se referem ao mesmo objeto. Use essas ideias para escolher um vetor ou um ArrayList para uma tarefa específica.
2.1 Crie vetores com posições fixas
Um vetor armazena uma quantidade fixa de elementos de um mesmo tipo. Você escolhe seu comprimento ao criá-lo. Os elementos podem mudar, mas o número de posições nesse vetor não. Vetores podem armazenar valores primitivos diretamente.
Crie e preencha posições
int[] scores = new int[5];
scores[0] = 90;
int first = scores[0];
int[] primes = {2, 3, 5, 7, 11};
new int[5] cria cinco posições. Seus índices são 0, 1, 2, 3 e 4. Colchetes permitem ler e escrever uma posição, então first passa a ser 90. O inicializador de primes cria e preenche cinco posições. Quando um vetor preenchido é necessário como expressão, por exemplo, como argumento de um método, use new int[] {2, 3, 5}.
O comprimento é um campo: scores.length, sem parênteses. Ele conta todas as posições, inclusive aquelas às quais você não atribuiu valores. Adicionar um valor à posição 0 não altera o comprimento de 5 para 1.
| Estrutura | Número de elementos | Leitura de um elemento |
|---|---|---|
| Vetor | a.length | a[i] |
| ArrayList | a.size() | a.get(i) |
| String | s.length() | s.charAt(i) |
Esses nomes não são intercambiáveis. Um vetor não tem o método size(), e uma cadeia de caracteres precisa de parênteses após length.
Conheça os valores iniciais
Novas posições de vetores recebem valores padrão. Vetores de tipos numéricos primitivos começam com zero: 0 para int, 0,0 para double. Um boolean[] começa com false; um char[] começa com o caractere cujo código é zero, escrito '\u0000'. Vetores de tipos de classe, incluindo String[], começam com referências null.
String[] words = new String[3];
words[0] = "sun";
System.out.println(words[0].length());
Isso imprime 3 porque a posição 0 agora se refere a "sun". As posições 1 e 2 ainda contêm null. Chamar words[1].length() lança NullPointerException: ainda não há uma cadeia de caracteres nessa posição. Uma posição com o valor padrão null é diferente de uma cadeia de caracteres vazia "", que é um objeto de comprimento 0.
Leia a saída e mantenha-se dentro do vetor
Importe java.util.Arrays e use System.out.println(Arrays.toString(scores)); para imprimir [90, 0, 0, 0, 0]. Imprimir scores diretamente mostra um código de tipo e identidade como [I@1b6d3586, não seus elementos. O código de identidade não é uma apresentação útil dos números armazenados.
Para uma semana de temperaturas em graus Celsius:
double[] temps = {12.5, 14.0, 9.5, 11.0, 15.5, 13.0, 10.5};
temps[2] = 10.0;
A leitura do terceiro dia muda de 9,5 para 10,0. A primeira leitura é temps[0]; a última é temps[6], ou temps[temps.length - 1]. temps[7] está fora do vetor. Java lança ArrayIndexOutOfBoundsException para um índice de vetor inválido. Em um laço com índice, use i < temps.length: i <= temps.length tenta acessar uma posição extra após a última válida. Um vetor de comprimento zero não tem nenhum índice de elemento válido.
Principais conclusões
- O comprimento de um vetor é fixado quando ele é criado.
- Use
a[i]para ler ou escrever uma posição ea.lengthpara contar as posições. - Novas posições numéricas contêm zero; novas posições de String contêm
null. Arrays.toString(a)imprime o conteúdo.- O último índice válido é
a.length - 1.
2.2 Copie, compare e troque elementos de vetores
Uma variável de vetor armazena uma referência, assim como uma variável de lista. Atribuir essa referência cria outro nome para o mesmo vetor. Uma cópia separada precisa de um novo objeto de vetor, e comparar conteúdos exige um método que verifique as posições.
Atribuição e cópia
int[] a = {4, 9, 2};
int[] alias = a;
int[] copy = Arrays.copyOf(a, a.length);
alias[0] = 99;
Agora a e alias mostram [99, 9, 2]; copy ainda mostra [4, 9, 2]. Arrays.copyOf(a, a.length) cria um novo vetor do mesmo comprimento. a.clone() também pode copiá-lo. Importe java.util.Arrays para usar os métodos utilitários.
Um comprimento solicitado diferente altera o novo vetor, não o antigo. Arrays.copyOf(new int[] {2, 3, 5}, 4) resulta em [2, 3, 5, 0]. As posições extras recebem valores padrão. Para fazer uma variável se referir a um vetor maior, atribua a cópia retornada a essa variável. Qualquer apelido de referência do original continua se referindo ao vetor antigo.
Chamadas de método compartilham o objeto
static void doubleAll(int[] values) {
for (int i = 0; i < values.length; i++) {
values[i] = values[i] * 2;
}
}
O parâmetro recebe uma cópia da referência. Portanto, o método altera as posições do vetor de quem o chamou. Reatribuir values a um novo vetor alteraria apenas o parâmetro. Um método também pode retornar um novo vetor: return new int[] {values[0], values[values.length - 1]}; produz [4, 2] para a entrada {4, 9, 2}. Essa expressão precisa de uma entrada não vazia porque lê dois índices.
A igualdade de conteúdo é diferente para vetores
Para vetores criados separadamente a = {1, 2} e b = {1, 2}, tanto a == b quanto a.equals(b) são falsos: equals de vetores verifica a identidade. Arrays.equals(a, b) é verdadeiro porque os elementos correspondentes são iguais. Isso difere de ArrayList, cujo equals compara conteúdos ordenados.
Guarde um valor antes de sobrescrevê-lo
Para trocar duas posições, mantenha um valor antigo em uma variável temporária:
int temp = a[0];
a[0] = a[2];
a[2] = temp;
Começando com {4, 9, 2}, a primeira linha guarda 4. A segunda produz [2, 9, 2]. A terceira restaura o 4 guardado no índice 2, completando [2, 9, 4]. Sem temp, atribuir a[2] = a[0] após a segunda linha copiaria 2 novamente e perderia o 4 original.
Escolha uma estrutura adequada aos dados
| Necessidade | Escolha adequada |
|---|---|
| Uma posição fixa para cada dia ou mês | Vetor |
| Valores primitivos sem objetos empacotadores | Vetor |
| Adicionar ou remover elementos conforme chegam dados | ArrayList |
Vetores também aparecem em main(String[] args) e como resultado de String.split. Para um String[] words, new ArrayList<>(Arrays.asList(words)) cria uma lista que pode crescer. Para um int[], crie um ArrayList<Integer> e adicione cada inteiro em um laço. Arrays.asList aplicado ao vetor primitivo trata o vetor inteiro como um elemento, portanto não cria uma lista de seus números individuais.
Principais conclusões
- A atribuição de vetores compartilha o mesmo objeto;
copyOfouclonecria uma cópia. - Use
Arrays.equalspara comparar conteúdos de vetores. - Um método pode alterar posições de um vetor compartilhado por meio de seu parâmetro.
- Uma variável temporária preserva um valor durante uma troca.
- Use vetores para posições fixas e ArrayLists para quantidades variáveis.
- Converta um vetor de tipo primitivo em uma lista de objetos empacotadores com um laço.
3Processe listas e vetores com laços
Laços transformam valores armazenados em resultados úteis: um total, uma contagem, um valor extremo, uma coleção filtrada ou um resultado de busca. Escolha como visitar os elementos conforme precise de valores ou posições. Acompanhe o estado de cada laço para tratar dados vazios, preservar partes fracionárias nas médias, interromper uma busca no momento certo e remover valores sem deixar passar os elementos que se deslocam.
3.1 Escolha um laço com índice ou um laço for-each
Um laço permite que um trecho de código processe cada elemento. A escolha depende do que o corpo precisa: apenas um valor, sua posição ou uma forma de escrever de volta na coleção. Tanto vetores quanto ArrayLists permitem laços com índice e laços for-each.
Visite valores em ordem
for (String task : tasks) {
System.out.println(task);
}
Leia isso como “para cada tarefa em tasks”. Com [shop, cook, clean], ele imprime as três cadeias de caracteres nessa ordem. A variável do laço tem o tipo dos elementos. Para ArrayList<Integer>, use int para desempacotar cada valor ou Integer para manter a referência ao objeto empacotador. Para caracteres de uma cadeia, for (char c : word.toCharArray()) visita os valores char.
Um laço for-each não fornece um índice. Se você precisa de linhas numeradas, use um laço com índice:
for (int i = 0; i < tasks.size(); i++) {
System.out.println((i + 1) + ". " + tasks.get(i));
}
O índice começa em 0, mas o número de linha exibido começa em 1. Os parênteses fazem de i + 1 uma adição antes de se tornar parte do texto. Para um vetor, altere a condição para i < tasks.length e leia tasks[i]. Um laço while pode fazer o mesmo trabalho inicializando um contador antes do laço e incrementando-o no corpo.
Escreva de volta por meio de uma posição
int[] nums = {4, 9, 2};
for (int n : nums) {
n = n * 2;
}
Isso deixa o vetor inalterado. Cada passagem coloca uma cópia de um valor primitivo em n; atribuir um valor a essa variável local não escreve na posição original. Para alterar o vetor:
for (int i = 0; i < nums.length; i++) {
nums[i] = nums[i] * 2;
}
O resultado é [8, 18, 4]. Para uma lista de inteiros, a atualização correspondente é list.set(i, list.get(i) * 2). O índice indica a Java qual elemento armazenado deve ser substituído.
Ajuste os limites ao corpo
Para percorrer uma lista em ordem inversa, comece em tasks.size() - 1, continue enquanto i >= 0 e use i--. Isso visita clean, cook e depois shop. Para pegar elementos alternados, pode-se usar i += 2 em um laço em ordem direta.
Comparações entre vizinhos precisam de um intervalo menor. Se o corpo lê tanto list.get(i) quanto list.get(i + 1), a condição é i < list.size() - 1. A última posição inicial válida é o penúltimo elemento. Usar a condição habitual de percurso completo tentaria ler um vizinho inexistente após o último elemento.
Ao processar duas listas de mesmo comprimento juntas, use um índice para acessar ambas. Por exemplo, names.get(i) e scores.get(i) descrevem as entradas correspondentes. Um laço for-each é mais simples quando a posição não tem importância, como ao imprimir cada nome ou adicionar cada valor a um total.
Começar em 1 pula silenciosamente o primeiro elemento. Usar <= size() ou <= length tenta acessar um índice extra inválido. Uma lista ou vetor vazio não precisa de uma regra especial de percurso: a condição inicial é falsa, então o corpo é executado zero vezes. Qualquer código posterior que divida pela contagem ou leia um elemento deve tratar esse caso vazio.
Principais conclusões
- O for-each é útil quando o corpo precisa apenas de cada valor.
- Use um índice para escrever valores armazenados, acompanhar posições ou comparar vizinhos.
- Atribuir um valor à variável do for-each não substitui um elemento do vetor ou da lista.
- O acesso ao vizinho em
i + 1exigei < size() - 1. - Coleções vazias fazem um percurso normal ser executado zero vezes.
3.2 Calcule um resultado a partir de vários elementos
Um acumulador mantém um resultado construído ao longo das passagens do laço. Inicialize-o antes do laço, atualize-o dentro dele e use-o depois. O valor inicial depende da tarefa: uma soma ou contagem começa em 0, enquanto um máximo precisa de um elemento real.
Totais e médias
int sum = 0;
for (int value : numbers) {
sum += value;
}
if (!numbers.isEmpty()) {
double average = (double) sum / numbers.size();
System.out.println(average);
}
Para [4, 7, 8], sum muda de 0 para 4, depois 11 e depois 19. Ambos os operandos em sum / numbers.size() seriam inteiros, resultando em 6. Converter sum explicitamente antes da divisão resulta em aproximadamente 6,33. Converter o quociente já calculado apenas transformaria o 6 truncado em 6,0.
Uma coleção vazia não tem uma média comum. A divisão inteira por zero lança ArithmeticException; a divisão em ponto flutuante 0.0 / 0 resulta em NaN. Decida o que o caso vazio significa para o programa antes de dividir, por exemplo, exibindo “Nenhuma medição”. Para as distâncias decimais [5.0, 7.5, 10.0] km, um total double é 22,5 km e a média é 7,5 km.
Conte apenas as correspondências
Uma contagem condicional começa em 0 e só é incrementada quando seu teste é satisfeito. Para as temperaturas {22, 27, 31, 24, 26} em graus Celsius, if (t > 25) { count++; } produz 3. Coloque a inicialização fora do laço; redefinir count a cada passagem descartaria as correspondências anteriores.
Encontre um valor extremo e sua posição
Para um vetor não vazio, comece com int max = values[0];. Substitua max sempre que um valor visitado for maior. Começar em 0 falha em {-5, -2, -9}: informa 0, embora nenhum elemento tenha esse valor. Começar com -5 permite que o laço chegue ao máximo correto, -2. Um mínimo usa o mesmo padrão com <.
Quando a posição importa, mantenha o índice do melhor valor:
int best = 0;
for (int i = 1; i < numbers.size(); i++) {
if (numbers.get(i) > numbers.get(best)) {
best = i;
}
}
Para [4, 7, 8], best termina em 2, e numbers.get(best) é 8. O laço começa em 1 porque o índice 0 já é o candidato inicial. Com >, um valor igual não substitui o candidato atual, preservando o primeiro máximo. Com >=, cada empate o substitui, preservando o último máximo. Verifique se a coleção está vazia antes de criar um candidato no índice 0.
Colete valores correspondentes
A filtragem usa uma lista de resultado vazia como acumulador. Visite cada palavra, adicione-a quando word.length() > 4 e retorne o resultado. Para [sun, planet, moon, galaxy], o resultado é [planet, galaxy]. Ler a entrada e adicionar a uma lista separada deixa a entrada inalterada.
Para dois elementos Integer, == compara a identidade dos objetos. Valores pequenos mantidos em cache podem ocultar esse erro; valores maiores iguais podem ser objetos diferentes. Compare com equals ou desempacote primeiro em variáveis int. Os operadores numéricos <, >, <= e >= desempacotam valores empacotados, então o código do melhor índice compara seus números.
Principais conclusões
- Inicialize um acumulador antes do laço e atualize-o dentro dele.
- Faça a conversão explícita antes da divisão inteira para preservar a parte fracionária de uma média.
- Verifique se a coleção está vazia antes de calcular a média ou selecionar um valor extremo.
- Inicialize um máximo ou mínimo a partir de um elemento real.
>preserva o primeiro máximo;>=preserva o último.- A filtragem acumula correspondências em uma nova lista.
- Use igualdade de valor para dois objetos Integer.
3.3 Busque até encontrar uma correspondência ou chegar ao fim
Uma busca sequencial verifica os elementos em sequência. Ela funciona com dados em qualquer ordem. Uma busca bem-sucedida pela primeira correspondência pode parar antes; uma busca sem sucesso deve chegar ao fim para saber que nenhum elemento corresponde.
Retorne o primeiro índice correspondente
static int indexOfName(ArrayList<String> names, String target) {
for (int i = 0; i < names.size(); i++) {
if (names.get(i).equals(target)) {
return i;
}
}
return -1;
}
Se o primeiro nome correspondente estiver no índice 2, o método verifica os índices 0, 1 e 2 e retorna 2 imediatamente. O return -1 fica após o laço porque somente um percurso concluído estabelece que a busca falhou. Colocar else { return -1; } dentro dele faria o método parar no primeiro elemento que não correspondesse e ignorar todos os candidatos seguintes.
O marcador de ausência -1 não pode ser um índice válido. Quem chama o método deve verificá-lo antes de ler o resultado:
int index = indexOfName(names, "Ahmed");
if (index != -1) {
System.out.println(names.get(index));
}
O teste index > 0 deixaria passar uma correspondência válida no índice 0. Usar -1 diretamente em get lançaria uma exceção. Em uma lista vazia, o corpo do laço nunca é executado, e o método retorna -1 corretamente.
Ajuste a comparação à tarefa
Para valores exatos em listas, contains e indexOf já fazem uma busca sequencial. Escreva um laço para um vetor ou uma condição como “começa com L”. Use equals ou equalsIgnoreCase para cadeias de caracteres, == para valores primitivos e equals para dois objetos Integer. Um teste de identidade de cadeias de caracteres pode deixar passar textos iguais.
Para String[] cities = {"Oslo", "Lima", "Lagos", "Pune"}, teste cities[i].startsWith("L"). O índice 0 falha; o índice 1 é aceito, então o resultado da primeira correspondência é 1. Se a tarefa pedir todas as correspondências, não retorne nesse ponto. Acrescente os índices correspondentes a uma lista de resultados e termine o percurso; isso resulta em [1, 2]. Para contar correspondências, incremente um contador em vez de armazenar posições.
Escolha a forma da resposta
Uma busca com resposta sim ou não pode começar com boolean found = false;. Ao encontrar uma correspondência, defina-a como verdadeira e use break para sair do laço. Sem o break, a resposta final continua verdadeira, mas o programa verifica valores de que não precisa mais. Um método de busca também pode retornar true imediatamente e retornar false após o laço.
Retornar um elemento exige um resultado separado para “nada encontrado”. Para uma String, isso costuma ser null; quem chama o método deve verificá-lo antes de chamar um método de String. Retornar um índice com -1 torna o caso de ausência visível sem afirmar que uma cadeia de caracteres vazia é um dado ausente.
Conte o trabalho que a busca realmente faz
Um alvo na primeira posição exige uma comparação. Um alvo na terceira posição exige três. Um alvo ausente em 10.000 nomes exige todas as 10.000 comparações. A primeira comparação sem correspondência não pode estabelecer que o alvo está ausente das posições restantes. Uma busca por todas as correspondências também verifica cada elemento, mesmo após uma correspondência inicial, porque valores posteriores também podem corresponder.
Principais conclusões
- A busca sequencial visita elementos em sequência e funciona com qualquer ordem de entrada.
- Retorne um índice na primeira correspondência; retorne -1 somente após o laço.
- Use a comparação adequada ao tipo do elemento.
- Buscas por todas as correspondências continuam após encontrar uma.
- Verifique um marcador de ausência antes de usar o resultado da busca.
3.4 Remova elementos sem pulá-los
Remover elementos de um ArrayList altera as posições que um laço tenta visitar. O padrão seguro depende de você precisar alterar a lista original ou construir um resultado separado. Substituir valores é mais simples porque mantém as posições no lugar.
Veja como um laço em ordem direta pula um valor
Suponha que um laço remova números pares de [3, 8, 8, 5] e sempre incremente i. No índice 1, ele remove o primeiro 8. O segundo 8 passa para o índice 1, mas a próxima passagem usa o índice 2. O resultado é [3, 8, 5], com um número par restante. A condição estava correta; o problema foi o deslocamento após a remoção.
Um laço for-each sobre um ArrayList também não deve adicionar ou remover elementos por meio da lista. Ele usa um iterador cujo estado de percurso deixa de corresponder à lista alterada. Java geralmente informa uma ConcurrentModificationException. Algumas alterações podem, em vez disso, encerrar o laço silenciosamente, deixando um elemento sem ser visitado. A ausência de uma exceção não torna essa alteração segura.
Remova em ordem inversa para manter estáveis as posições não verificadas
for (int i = numbers.size() - 1; i >= 0; i--) {
if (numbers.get(i) % 2 == 0) {
numbers.remove(i);
}
}
Para [3, 8, 8, 5], o índice 3 contém 5 e é mantido. O índice 2 contém 8 e é removido. O índice 1 ainda contém o outro 8 e é removido em seguida. O índice 0 contém 3 e é mantido. O resultado é [3, 5]. Uma remoção desloca os elementos à direita do índice atual, que esse laço em ordem inversa já verificou.
Construa a lista dos valores a manter
Quando a lista original deve permanecer inalterada, crie uma nova lista:
ArrayList<Integer> odds = new ArrayList<>();
for (int value : numbers) {
if (value % 2 != 0) {
odds.add(value);
}
}
Esse laço for-each é seguro porque lê numbers e adiciona elementos a outra lista. Com [3, 8, 8, 5] como entrada, odds contém [3, 5] e a entrada ainda contém os quatro valores. Um vetor também não pode diminuir; filtrar seus valores também exige um novo vetor ou uma lista.
Deixe um iterador gerenciar sua própria remoção
Iterator<Integer> it = numbers.iterator();
while (it.hasNext()) {
if (it.next() % 2 == 0) {
it.remove();
}
}
Importe java.util.Iterator. next() fornece o próximo elemento, e it.remove() remove o elemento recém-retornado, mantendo consistente a posição do iterador. Não substitua essa chamada por numbers.remove(...) nesse laço.
Um laço while em ordem direta também pode funcionar se incrementar apenas quando nada for removido. Após a remoção, ele deve examinar novamente o mesmo índice, onde chegou o próximo elemento. Isso exige mais cuidado do que um laço em ordem inversa ou uma nova lista de resultado.
Substituições e adições têm efeitos diferentes
set(i, value) é seguro em um laço com índice porque não altera o tamanho nem as posições. Adicionar em cada passagem enquanto se testa i < list.size() pode continuar afastando o final indefinidamente. Guarde int originalSize = list.size(); e percorra somente até esse limite quando cada elemento original deve causar o acréscimo de um valor.
Principais conclusões
- A remoção em ordem direta seguida de
i++pula o elemento deslocado para a posição removida. - Um laço em ordem inversa pode remover por índice com segurança.
- Filtrar para outra lista preserva a original.
- Use o próprio
removede um iterador durante seu percurso. - Um percurso for-each não deve adicionar ou remover elementos por meio da lista de origem.
- Limite laços de acréscimo ao tamanho original quando processar apenas os elementos originais.
4Trabalhe com texto usando métodos de String
O texto chega como caracteres, mas um programa frequentemente precisa de nomes, números ou trechos selecionados de uma linha. Leia posições com métodos de String, encontre um separador antes de recortar o texto e transforme campos separados em valores com os quais você possa calcular. Acompanhe os resultados retornados: cadeias de caracteres são imutáveis, e limpá-las só ajuda o código posterior quando ele usa o texto limpo.
4.1 Leia caracteres e guarde os resultados de String
Uma String armazena texto como uma sequência de valores char. Os índices começam em 0, assim como em vetores e listas. Um objeto String não pode mudar após a criação, portanto métodos que produzem texto alterado retornam um resultado que você precisa guardar.
Um caractere é diferente de uma cadeia de caracteres
"Hello".length() é 5. "Hello".charAt(0) é 'H' e charAt(4) é 'o'. Um char usa aspas simples e contém uma unidade de código UTF-16; uma String usa aspas duplas e pode conter zero, uma ou muitas dessas unidades. "Java".charAt(0) == 'J' compara dois caracteres primitivos. Comparar esse char com "J" não compila porque os tipos são diferentes.
charAt(length()) ultrapassa o fim e lança StringIndexOutOfBoundsException. Até charAt(0) falha para "". Verifique isEmpty() antes de ler o primeiro caractere da entrada.
length() conta valores char de UTF-16, que nem sempre são símbolos exibidos completos. "café".length() é 4; "Hi 👋".length() é 5 porque o emoji de mão acenando ocupa duas posições char. Use essa contagem ao raciocinar sobre os índices desses métodos.
Visite e teste os caracteres
String text = "Programming in Java".toLowerCase();
int vowels = 0;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if ("aeiou".indexOf(c) >= 0) {
vowels++;
}
}
A conversão para minúsculas permite que o mesmo teste de pertinência reconheça vogais maiúsculas e minúsculas. Cada indexOf(c) é não negativo quando o caractere aparece em "aeiou". A contagem chega a 6: o, a, i, i, a, a. for (char c : text.toCharArray()) pode visitar os mesmos valores sem um índice.
A classe Character fornece testes como isLetter, isDigit, isWhitespace e isUpperCase. Character.isDigit('7') é verdadeiro, enquanto Character.isLetter('7') é falso. Character.toUpperCase(c) e toLowerCase(c) retornam valores char convertidos.
Caracteres também têm códigos numéricos. 'a' + 1 produz o int 98; (char) ('a' + 1) converte esse código em 'b'. Para um caractere de algarismo ASCII, subtrair '0' fornece seu valor: '7' - '0' é 7. Subtrair o código de zero funciona porque os códigos desses algarismos são consecutivos.
Leia a concatenação da esquerda para a direita
| Expressão | Resultado |
|---|---|
"Total: " + 3 + 4 | "Total: 34" |
3 + 4 + " items" | "7 items" |
"Total: " + (3 + 4) | "Total: 7" |
Quando o lado esquerdo de + é texto, o próximo número é unido como texto. Os parênteses forçam a adição numérica antes da junção. Algumas junções em uma expressão são um uso claro de +.
Guarde o texto retornado
String name = "Lena";
name.toUpperCase();
System.out.println(name);
name = name.toUpperCase();
A impressão ainda mostra "Lena": a chamada descartada não alterou seu objeto. A atribuição faz então name se referir a "LENA". A imutabilidade de String significa que o texto antigo permanece inalterado mesmo que outras variáveis se refiram a ele. Guardar o resultado e alterar o objeto original são operações diferentes.
Principais conclusões
charAt(i)retorna um char; os índices válidos terminam emlength() - 1.- Valores char usam aspas simples; cadeias de caracteres usam aspas duplas.
- O comprimento de uma String conta valores char de UTF-16, então alguns símbolos ocupam duas posições.
- Métodos de
Charactertestam e convertem valores char individuais. - A união de cadeias de caracteres com
+ocorre da esquerda para a direita. - Armazene o resultado de uma transformação de String.
4.2 Localize e extraia trechos de texto
O processamento de texto frequentemente segue uma sequência curta: encontrar um marcador, verificar se ele existe e extrair o trecho necessário. Operações de limpeza podem preparar o texto antes de uma busca ou comparação. Cada operação de String retorna um resultado sem alterar seu objeto original.
Encontre posições ou faça uma pergunta de sim ou não
Para "banana", indexOf('a') retorna 1, indexOf("a", 2) retorna 3 e lastIndexOf('a') retorna 5. O segundo argumento escolhe onde começa a busca em ordem direta. Uma busca sem correspondência retorna -1, como em indexOf("x").
Use contains(text) quando você só precisa saber se um texto aparece. startsWith(prefix) verifica o início e endsWith(suffix), o fim. "report.pdf".endsWith(".pdf") é verdadeiro. Essas buscas distinguem maiúsculas de minúsculas: "Hello".contains("hello") é falso. Os métodos de índice aceitam um char ou uma String; contains recebe texto.
Substring termina imediatamente antes do índice final
String word = "programming";
String middle = word.substring(3, 7);
String tail = word.substring(3);
middle é "gram", usando as posições 3, 4, 5 e 6. Seu comprimento é 7 - 3, ou 4. tail é "gramming", porque omitir o argumento final faz a extração ir até o fim da cadeia de caracteres. O início deve ser não negativo e não pode ser maior que o fim; o fim não pode ultrapassar length(). Limites inválidos lançam StringIndexOutOfBoundsException.
Para um endereço de e-mail, encontre o separador antes de extrair os trechos:
String email = "lena.ito@example.com";
int at = email.indexOf("@");
if (at != -1) {
String user = email.substring(0, at);
String domain = email.substring(at + 1);
}
O separador está no índice 8. O primeiro trecho termina antes dele, resultando em "lena.ito"; o segundo começa depois dele, resultando em "example.com". Se o marcador estiver ausente, at é -1. Chamar substring(0, at) sem a verificação falharia. Começar o segundo trecho em at manteria o @ no domínio.
Limpe apenas o que a operação visa
| Método | Efeito |
|---|---|
toUpperCase() / toLowerCase() | Retornam texto com maiúsculas ou minúsculas convertidas |
trim() | Remove caracteres iniciais e finais com códigos até U+0020 |
strip() | Remove caracteres de espaço em branco iniciais e finais reconhecidos por Character.isWhitespace |
replace(target, replacement) | Substitui cada ocorrência literal |
repeat(n) | Une n cópias do texto |
" hello ".trim() resulta em "hello"; os espaços internos permanecem. strip() trata outros caracteres de espaço em branco do Unicode, como o espaço eme. Ele usa a definição de espaço em branco de Java, que não inclui todos os caracteres que parecem espaços. "banana".replace('a', 'o') resulta em "bonono". "ab".repeat(3) resulta em "ababab".
Vazio e em branco são diferentes
isEmpty() testa se o comprimento é 0. isBlank() também aceita texto composto apenas de caracteres de espaço em branco de Java. Para " ", o primeiro é falso e o segundo é verdadeiro. Use o teste que corresponde à regra de entrada. Para limpar uma resposta como " Yes ", answer.trim().toLowerCase() retorna "yes". Armazene esse texto retornado se a variável deve guardar o valor limpo; uma chamada isolada answer.trim(); o descarta.
Principais conclusões
- Buscas por posição retornam -1 quando um marcador está ausente.
substring(begin, end)inclui begin e exclui end.- Verifique uma posição encontrada antes de usá-la como limite de extração.
replacesubstitui texto literal;trimestripatuam nas extremidades.isBlankaceita texto composto apenas de espaços em branco, enquantoisEmptyexige comprimento 0.
4.3 Transforme uma linha de texto em campos utilizáveis
Uma linha de dados pode conter vários valores separados por uma vírgula ou outro marcador. A divisão produz um vetor de cadeias de caracteres; a análise e conversão de texto (parsing) transforma então campos selecionados em números. Verifique a estrutura dos dados antes de usar suas posições.
Divida em um vetor
String[] fields = "Ada,36,London".split(",");
Há três campos: "Ada", "36" e "London". As vírgulas não são mantidas. fields.length é 3, e fields[1] ainda é texto, não um número.
O separador passado a split é uma expressão regular, um padrão que nem sempre é texto literal. Uma vírgula representa a si mesma, mas ., |, *, + e ? têm significados especiais. Para dividir uma cadeia de versão em pontos literais, use "1.5.2".split("\\."). Duas barras invertidas na string Java produzem a única barra invertida do padrão que torna o ponto literal. split("."), por sua vez, corresponde a caracteres individuais e produz um vetor vazio nesse exemplo.
Trate espaços e partes vazias
Dividir "a b" em " " produz três partes: "a", "" e "b". Cada separador é um espaço, então espaços adjacentes deixam uma parte vazia entre eles. Para sequências de caracteres de espaço em branco, use:
String[] words = " red green blue ".trim().split("\\s+");
O resultado é [red, green, blue]. Usar trim antes evita uma parte inicial vazia causada por um separador no início. Por padrão, split descarta partes vazias no final: "a,b,,".split(",") produz apenas "a" e "b". Conte os campos realmente resultantes antes de acessá-los por índice.
Converta cada campo para o tipo desejado
Integer.parseInt("42") retorna o int primitivo 42. Integer.valueOf("-7") retorna um objeto Integer. Double.parseDouble("5.2") retorna 5,2, usando um ponto como separador decimal independentemente da configuração regional do computador. A conversão de inteiros aceita texto inteiro sem separador decimal. Integer.parseInt("4.5") falha em vez de arredondar.
Use trim nos campos antes da conversão, especialmente em texto inteiro: Integer.parseInt(" 42") lança NumberFormatException. Dividir em vírgulas não remove espaços ao redor dos campos. Uma contagem correta de campos também não garante que um campo contenha um número válido.
Leia um registro completo
String line = "Amira,10.5,63";
String[] parts = line.split(",");
if (parts.length == 3) {
String name = parts[0].trim();
double distanceKm = Double.parseDouble(parts[1].trim());
int minutes = Integer.parseInt(parts[2].trim());
double pace = minutes / distanceKm;
System.out.println(name + ": " + pace + " min/km");
}
A distância é 10,5 km, o tempo é 63 minutos e o ritmo é 6,0 min/km. A linha incompleta "Amira,10.5" tem apenas dois campos; sem a verificação da contagem, parts[2] lançaria ArrayIndexOutOfBoundsException. Um programa pode pular ou informar esse registro incompleto antes de usar qualquer posição ausente.
Converta ou una texto novamente
String.valueOf(42) e Integer.toString(42) resultam em "42". String.join(", ", List.of("Oslo", "Lima", "Pune")) resulta em "Oslo, Lima, Pune", inserindo separadores apenas entre as partes. Ele aceita uma lista, um vetor ou argumentos separados de cadeias de caracteres. A junção não converte nem calcula: ela combina as cadeias de caracteres fornecidas.
Principais conclusões
splitretorna um vetor de String e trata seu separador como um padrão.- Use o escape
"\."para um ponto literal em código Java. - Use trim antes de dividir sequências de espaços em branco e antes de converter campos inteiros.
- Por padrão, split descarta campos vazios no final.
- Verifique a contagem de campos e o texto numérico antes de usar os dados convertidos.
- Use
String.joinpara partes de texto e métodos de conversão para números.
5Compare cadeias de caracteres corretamente e construa texto com eficiência
Textos de aparência igual podem pertencer a objetos String diferentes. Escolha uma comparação adequada à tarefa: igualdade de conteúdo, igualdade sem distinção entre maiúsculas e minúsculas ou ordenação de caracteres de Java. Depois, construa e edite trechos maiores de texto com StringBuilder. Acompanhar referências e valores retornados ajuda você a prever se uma operação altera texto existente, cria um resultado ou apenas compara dois objetos.
5.1 Compare conteúdos e ordenação de cadeias de caracteres
Duas variáveis podem conter texto com os mesmos caracteres sem se referir ao mesmo objeto String. Escolha uma comparação com base na pergunta: conteúdos iguais, conteúdos iguais sem distinção entre maiúsculas e minúsculas ou qual texto vem primeiro na ordenação de Java.
Use equals para conteúdos
String answer = new String("yes");
System.out.println(answer == "yes");
System.out.println(answer.equals("yes"));
O primeiro resultado é falso: o objeto criado separadamente não é o objeto do literal. O segundo é verdadeiro porque os caracteres correspondem. Literais idênticos, como em "yes" == "yes", compartilham um objeto e podem fazer a comparação de identidade parecer confiável. Texto obtido em tempo de execução pode usar objetos novos ou existentes, então a identidade não é o teste para verificar uma entrada correspondente.
equalsIgnoreCase ignora a diferença entre maiúsculas e minúsculas: "YES".equalsIgnoreCase("yes") é verdadeiro. Ele não remove espaços. Para aceitar também espaços ao redor, limpe a entrada antes de comparar.
Para uma variável que pode ser null, chame o método a partir de um literal conhecido que não seja nulo: "yes".equals(answer) retorna falso para null. answer.equals("yes") lança NullPointerException se answer for null, pois nenhum objeto recebe a chamada.
Um laço de comando pode testar !command.equals("quit"). O ! nega a igualdade de conteúdo. command != "quit" testa referências e pode manter um laço em execução mesmo quando os caracteres digitados são “quit”.
Interprete o sinal de compareTo
a.compareTo(b) compara valores char de UTF-16 em sequência. Retorna um número negativo se a vier antes de b, zero se forem iguais e um número positivo se vier depois. Apenas o sinal importa para a ordenação; o resultado não precisa ser exatamente -1 ou 1.
| Comparação | Sinal | Motivo |
|---|---|---|
"apple".compareTo("banana") | Negativo | O primeiro char diferente vem antes |
"pear".compareTo("pear") | Zero | Todos os caracteres correspondem |
"car".compareTo("carpet") | Negativo | Prefixo igual, cadeia mais curta primeiro |
"10".compareTo("9") | Negativo | '1' vem antes de '9' |
Números armazenados como texto, portanto, não seguem a ordem numérica. Converta-os quando a tarefa for numérica. Letras maiúsculas sem acento do inglês precedem as minúsculas sem acento, então "Zebra" vem antes de "apple". O nome acentuado "Émile" vem depois de "Zoe" nessa ordenação. compareToIgnoreCase ignora maiúsculas e minúsculas; a ordem de dicionário específica de um idioma exige java.text.Collator.
Reutilize o padrão de mínimo para nomes
Para uma lista não vazia [Mia, Ahmed, Lucia]:
String first = names.get(0);
for (String name : names) {
if (name.compareTo(first) < 0) {
first = name;
}
}
"Mia" começa como candidato. "Ahmed" vem antes na comparação e se torna o candidato; "Lucia" não o substitui. O resultado é "Ahmed". Verifique se a lista está vazia antes de ler seu primeiro elemento.
Um char individual é primitivo, então word.charAt(0) == 'A' é uma comparação correta de caracteres quando se sabe que a palavra não está vazia. O problema com == diz respeito à identidade de objetos, não a toda comparação que envolve texto.
Principais conclusões
- Use
equalspara conteúdo de String eequalsIgnoreCasepara ignorar maiúsculas e minúsculas. - Um literal conhecido pode receber
equalscom segurança quando o argumento pode ser null. ==verifica a identidade de String, mesmo quando o compartilhamento de literais oculta o erro.- Interprete apenas o sinal de
compareTo. - A ordenação de cadeias de caracteres de Java segue UTF-16, não a ordem numérica ou de dicionário específica de um idioma.
5.2 Construa e edite texto com StringBuilder
Um StringBuilder contém texto modificável. Ele é útil quando um laço adiciona muitas partes ou quando caracteres precisam ser editados no próprio objeto. Algumas junções em uma expressão ficam claras com +, mas reconstruir repetidamente uma String crescente pode copiar seu conteúdo acumulado muitas vezes.
Acrescente partes e finalize com uma String
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++) {
if (i > 1) {
sb.append(", ");
}
sb.append(i);
}
String result = sb.toString();
Não é necessária importação. append acrescenta cadeias de caracteres, chars, números ou booleanos ao final. A primeira passagem adiciona apenas 1; a segunda adiciona ", " e depois 2. O resultado é "1, 2, 3, 4, 5". Colocar um separador após cada número deixaria um separador indesejado no final. Para uma lista existente de cadeias de caracteres, String.join(", ", list) trata os separadores diretamente.
Repetir text += piece em um laço forma novos resultados String imutáveis. O prefixo acumulado precisa ser incluído a cada vez, então a quantidade copiada pode crescer quadraticamente conforme um resultado longo cresce. Um construtor de texto mantém um buffer modificável e acrescenta conteúdo a ele sem reconstruir todo o prefixo a cada passagem.
Edite posições e intervalos
| Método | Efeito |
|---|---|
insert(i, x) | Insere na posição i |
delete(start, end) | Remove um intervalo, excluindo end |
deleteCharAt(i) | Remove um char |
setCharAt(i, c) | Substitui um char |
replace(start, end, text) | Substitui um intervalo, excluindo end |
reverse() | Inverte a ordem do construtor de texto |
length() e charAt(i) leem o construtor de texto como leem uma String. Os índices descrevem seu estado atual; uma inserção ou exclusão pode alterar posições posteriores.
Comece com new StringBuilder("Jva"). insert(1, 'a') produz "Java"; setCharAt(0, 'j') resulta então em "java". Para "2026-10-22", delete(4, 7) remove as posições 4, 5 e 6, deixando "2026-22". Substituir as posições 7 até 9 em "I like tea" por "coffee" resulta em "I like coffee".
Encadeie apenas métodos que retornam o construtor de texto
new StringBuilder().append("a").append(1).append('b').toString() resulta em "a1b". As chamadas de append retornam o mesmo construtor de texto, permitindo outra chamada. Os métodos de edição apresentados aqui também retornam o construtor, exceto setCharAt, que retorna void e precisa de uma instrução separada.
reverse() altera o objeto receptor. Se sb contiver "stressed", então String r = sb.reverse().toString(); deixa tanto r quanto o texto do construtor como "desserts". Para preservar o construtor original, inverta um novo construtor criado a partir de seu texto.
Compare os conteúdos finais
Para verificar um palíndromo, acrescente a forma minúscula de cada letra em "Was it a car or a cat I saw". O texto limpo é "wasitacaroracatisaw". Inverta um novo construtor que contenha esse texto, converta-o em uma String e compare com clean.equals(reversed). A comparação é verdadeira.
StringBuilder não sobrescreve equals para comparar conteúdos. Construtores separados que contêm "abc" não são iguais por esse método, e um construtor não é igual a uma String. Converta primeiro: sb1.toString().equals(sb2.toString()) compara o texto real.
Principais conclusões
- Use
appendpara construir um resultado longo etoStringpara finalizá-lo. - Coloque separadores entre valores, evitando um separador extra no final.
- Edições alteram o construtor de texto existente; os finais dos intervalos são excluídos.
setCharAtretorna void, então não pode ser encadeado.reversealtera o construtor de texto no qual é chamado.- Converta construtores de texto em Strings antes de comparar conteúdos.
Exercícios resolvidos de Listas e vetores em Java
1Construa e compartilhe uma lista de leitura
13 passos
- 1IntroduçãoAcompanhe uma lista de leitura que muda
Uma lista de leitura pode começar vazia e crescer conforme chegam sugestões. Você adicionará títulos, corrigirá uma entrada, removerá uma duplicata e passará a lista para um método. Mantenha duas perguntas separadas ao acompanhar o código: qual elemento ocupa cada índice agora e quais variáveis se referem ao mesmo objeto de lista? A primeira explica as mudanças de posição; a segunda explica as alterações compartilhadas.
- 2ExplicaçãoCrie a coleção vazia
Importe
java.util.ArrayListe crie a lista:ArrayList<String> reading = new ArrayList<>(); reading.add("Orbit"); reading.add("River");O tipo dos elementos é String. A lista vazia cresce até o tamanho 2 e contém
[Orbit, River]. O índice 0 identifica Orbit e o índice 1 identifica River. O diamante<>permite que Java infira o tipo dos elementos a partir do lado esquerdo. - 3ExemploInsira antes de um título armazenado
Continue com a mesma lista:
reading.add(1, "Cloud"); String old = reading.set(2, "Forest");A inserção desloca River do índice 1 para o índice 2, resultando em
[Orbit, Cloud, River]. A substituição altera então o índice 2 para Forest e retorna River emold. A lista final é[Orbit, Cloud, Forest]. Diferentemente da inserção, a substituição não alterou o tamanho. - 4DesafioEncontre a próxima posição válida
A lista é
[Orbit, Cloud, Forest]. O que acontece se você chamarreading.add(3, "Dune")? O quereading.get(3)retornaria depois?---reveal---
A inserção acrescenta Dune ao final porque o índice
size()é permitido para inserção. O tamanho passa a ser 4, então o índice 3 agora é válido para leitura e retorna"Dune". Ler o índice 3 antes da inserção teria falhado. - 5ExplicaçãoRemova um valor e acompanhe o deslocamento
Adicione outro Cloud e depois remova por valor:
reading.add("Cloud"); boolean removed = reading.remove("Cloud");A lista antes da remoção é
[Orbit, Cloud, Forest, Dune, Cloud]. Apenas o primeiro Cloud é removido, então o resultado é[Orbit, Forest, Dune, Cloud]eremovedé verdadeiro. Forest e todos os elementos seguintes se deslocam uma posição para a esquerda. O último Cloud permanece na lista. - 6DicaPergunte se existe ou onde está
Para
[Orbit, Forest, Dune, Cloud],contains("Orbit")é verdadeiro eindexOf("Orbit")é 0. Um teste de valor encontrado deve aceitar o índice 0: useindex != -1após guardar o resultado da busca. Um título ausente resulta em -1. As buscas comparam o conteúdo de String distinguindo maiúsculas de minúsculas, então buscar"orbit"não encontra"Orbit". UselastIndexOfquando a última posição correspondente importar. - 7DesafioRemova um número pelo seu valor
Um
ArrayList<Integer>separado contém[9, 1, 9]. Você quer remover o primeiro valor 9. Qual chamada funciona e o que resta?---reveal---
numbers.remove(Integer.valueOf(9))seleciona a remoção por valor e deixa[1, 9].remove(9)selecionaria o índice 9, que é inválido. O int primitivo seleciona um índice mesmo que a própria lista armazene inteiros. - 8AnalogiaDois nomes em um caderno
Pense em uma referência como uma anotação que indica onde um caderno está guardado. Copiar a anotação não cria outro caderno. Com
ArrayList<String> shared = reading;, ambas as variáveis identificam uma lista, entãoshared.add("Coast")é visível por meio dereading. Um construtor de cópia,new ArrayList<>(reading), cria outra lista com suas próprias posições. - 9ExemploCopie antes de alterar
Comece com
[Orbit, Forest, Dune, Cloud]:ArrayList<String> copy = new ArrayList<>(reading); copy.remove("Dune");A cópia passa a ser
[Orbit, Forest, Cloud], enquanto reading permanece inalterada. Ambas as listas se referiam inicialmente aos mesmos elementos String imutáveis, mas suas posições são separadas. Remover uma posição de uma não a remove da outra. - 10Ideia-chaveUm parâmetro é outro nome local
Um método recebe uma cópia de uma referência de lista. Chamar
titles.clear()por meio desse parâmetro altera a lista compartilhada. Atribuirtitles = new ArrayList<>();altera apenas o nome local, então quem chamou o método mantém sua lista antiga. Uma lista vazia ainda é um objeto; null significa que não há objeto. Chamarsize()em uma lista vazia retorna 0, enquanto chamá-lo por meio de null falha. - 11DesafioSepare alterações compartilhadas de reatribuição local
A lista de quem chama o método é
[North, South]. O método executa estas instruções:titles.remove("North"); titles = new ArrayList<>(); titles.add("East");O que quem chamou o método ainda vê?
---reveal---
Ele vê
[South]. A remoção altera primeiro o objeto compartilhado. A reatribuição redireciona então apenas o parâmetro do método, portanto East é adicionado a outra lista. A referência de quem chamou o método nunca foi redirecionada. - 12DesafioCombine cópia, busca e edição
Considere que a contém
[Lake, Hill]e executeb = new ArrayList<>(a),b.add("Lake")eb.remove(b.indexOf("Lake")). O que a e b contêm, ea.equals(b)retorna verdadeiro?---reveal---
A busca retorna o índice 0, então b passa a ser
[Hill, Lake]. A lista original a permanece[Lake, Hill]. Os tamanhos são iguais, mas a ordem é diferente, entãoequalsde listas retorna falso. - 13RecapitulaçãoPreveja uma alteração na lista
Interprete uma edição identificando primeiro seu alvo: uma posição para
setou remoção por índice, um valor para remoção por valor e uma posição de inserção paraadd. Depois, atualize os índices deslocados antes de acompanhar a próxima chamada. Para prever o que outra variável vê, acompanhe se ela compartilha a lista ou contém uma cópia separada. A reatribuição em um método afeta seu parâmetro; as edições afetam o objeto que esse parâmetro alcança no momento.
2Armazene e copie leituras em posições fixas
10 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoDê a cada leitura uma posição fixa
- 2ExplicaçãoAloque as posições
- 3ExemploImprima os dados necessários
- 4DesafioLeia a última posição
- 5ExemploAcompanhe um apelido de referência
- 6ExemploCrie uma cópia maior
- 7DesafioEscolha uma comparação de conteúdo
- 8ExemploGuarde antes de sobrescrever
- 9DesafioMantenha os dados antigos ao ampliar
- 10RecapitulaçãoSepare edições de posições da criação de armazenamento
3Transforme leituras em resultados
17 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoDê a cada laço uma tarefa clara
- 2ExplicaçãoLeia valores ou leia posições
- 3DesafioDeixe espaço para um vizinho
- 4ExemploMantenha uma soma ao longo do laço
- 5ExemploDivida preservando a parte fracionária
- 6Ideia-chaveUm valor extremo precisa de um candidato real
- 7DesafioAcompanhe o último máximo empatado
- 8ExplicaçãoPare somente quando a resposta for conhecida
- 9ExemploEncontre a primeira leitura acima de um limite
- 10DesafioPasse da primeira correspondência para todas
- 11ExemploObserve um elemento pulado na remoção em ordem direta
- 12ExplicaçãoPercorra em ordem inversa para remover
- 13ConexãoPreserve a origem com filtragem
- 14DicaUse o iterador responsável pelo percurso
- 15DesafioDefina o limite de um laço que acrescenta elementos
- 16DesafioCalcule a média apenas dos valores selecionados
- 17RecapitulaçãoAcompanhe o estado e as regras de parada
4Leia um registro de texto em etapas
14 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoDo texto bruto aos dados
- 2ExplicaçãoLeia um caractere por vez
- 3ExemploConte algarismos em um rótulo
- 4DesafioGuarde uma transformação
- 5ExplicaçãoLocalize primeiro um limite
- 6ExemploConte as posições incluídas
- 7DicaEscolha a regra de limpeza
- 8DesafioTrate um separador ausente
- 9ExplicaçãoDivida o registro em campos
- 10ExemploConverta e calcule
- 11Ideia-chaveSeparadores podem descrever padrões
- 12DesafioConverta após verificar a estrutura
- 13DesafioNormalize palavras e una-as
- 14RecapitulaçãoVerifique o tipo do resultado em cada etapa
5Compare comandos e monte um relatório
12 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoCompare significados e construa um resultado
- 2ExplicaçãoEscolha um teste de conteúdo
- 3ExemploIgnore maiúsculas e minúsculas sem ignorar espaços
- 4DesafioExplique um teste baseado em literais
- 5ExplicaçãoOrdene pelo primeiro char diferente
- 6DesafioMantenha o candidato que vem primeiro
- 7ExplicaçãoAcrescente a uma sequência modificável
- 8ExemploColoque separadores entre as partes
- 9ExemploEdite as posições atuais
- 10DesafioMantenha a ordem original
- 11DesafioConstrua um relatório filtrado
- 12RecapitulaçãoUse a operação adequada à pergunta
Questões de Listas e vetores em Java
Conjunto 1: Crie, edite e compartilhe coleções10 Questões de Prática
Questão 1 de 10
Mostrar respostaOcultar resposta
Integer é o tipo dos elementos de uma lista de valores inteiros. ArrayList<int> não compila porque um tipo primitivo não pode ser um argumento de tipo genérico. Um vetor de comprimento zero e uma List.of() não modificável também não podem fornecer a lista que cresce conforme solicitado.Questão 2 de 10
O que isto imprime?
ArrayList<String> tools = new ArrayList<>(List.of("pen", "ruler"));
tools.add(1, "tape");
String old = tools.set(2, "clip");
System.out.println(old + ": " + tools);
Mostrar respostaOcultar resposta
"ruler" para o índice 2, então set(2, "clip") o substitui e retorna "ruler". A lista final é [pen, tape, clip]. Retornar "clip" confundiria o novo elemento com o valor antigo que set retorna.Questão 3 de 10
ArrayList<Integer> contém [12, 24, 36]. Qual chamada remove o valor 24?Mostrar respostaOcultar resposta
Integer.valueOf seleciona a remoção por valor, então a lista passa a ser [12, 36]. Passar o int primitivo 24 seleciona a remoção por índice e falha porque o índice 24 não existe. Substituir o índice 1 por 24 deixaria a lista inalterada.Questão 4 de 10
[Nora, Ravi, Nora, Mei]. Após names.remove("Nora"), quais são os resultados de names.indexOf("Nora") e names.lastIndexOf("Mei"), nessa ordem?Mostrar respostaOcultar resposta
"Nora", deixando [Ravi, Nora, Mei]. A Nora restante está no índice 1, e Mei foi deslocada para o índice 2. Um resultado de -1 para Nora pressuporia que uma remoção exclui todos os valores iguais.Questão 5 de 10
Quais são os conteúdos de a e c após este código?
ArrayList<String> a = new ArrayList<>(List.of("oak"));
ArrayList<String> b = a;
ArrayList<String> c = new ArrayList<>(a);
b.add("elm");
c.set(0, "ash");
Mostrar respostaOcultar resposta
b compartilha uma referência com a, então adicionar por meio de b altera a única lista das duas variáveis. O construtor de cópia cria c antes dessa adição, deixando-a com uma posição independente. Esperar elm em c trataria uma cópia como uma ligação que acompanha adições posteriores.Questão 6 de 10
Arrays.toString(new boolean[3]) retorna?Mostrar respostaOcultar resposta
false, e Arrays.toString imprime todas elas. Null é o padrão para posições que armazenam referências a objetos, não booleanos primitivos. As posições já existem mesmo que nenhum valor tenha sido atribuído explicitamente.Questão 7 de 10
double[] readings tem comprimento 6. Qual expressão lê sua última posição?Mostrar respostaOcultar resposta
readings[5]. O índice 6 está uma posição além do fim e lança uma exceção. O acesso a um vetor usa colchetes, e seu length é um campo sem parênteses.Questão 8 de 10
Quais são os conteúdos de a e b após este código?
int[] a = {7, 3};
int[] b = Arrays.copyOf(a, 3);
b[0] = 8;
Mostrar respostaOcultar resposta
a confundiria a cópia com a referência compartilhada criada por b = a.Questão 9 de 10
{6, 2}. Quais são os resultados de a.equals(b) e Arrays.equals(a, b), nessa ordem?Mostrar respostaOcultar resposta
equals de vetores herda a comparação de identidade, então os vetores criados separadamente não são iguais por essa chamada. Arrays.equals compara os valores correspondentes e retorna verdadeiro. Esperar que ambas as chamadas retornem verdadeiro aplica a um vetor o comportamento de igualdade de conteúdo de ArrayList.Questão 10 de 10
O que a lista de quem chama o método contém após edit(a)?
static void edit(ArrayList<Integer> x) {
x.set(0, x.get(0) + 2);
x = new ArrayList<>(x);
x.add(9);
}
// In main:
ArrayList<Integer> a = new ArrayList<>(List.of(5, 8));
edit(a);
Mostrar respostaOcultar resposta
set inicial edita a lista compartilhada de quem chamou o método, alterando 5 para 7. O parâmetro é então redirecionado para uma cópia separada, e somente essa cópia recebe 9. Quem chamou o método mantém [7, 8]; incluir 9 significaria supor incorretamente que a reatribuição do parâmetro também redireciona a variável de quem chamou o método.Conjunto 2: Acompanhe laços e processe texto10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
for (int n : values) { n += 3; } no vetor {2, 6, 9}, o que o vetor contém?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
[5, 8, 9]. Após somá-la em um int total, que valor (double) (total / values.size()) produz?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Para a lista não vazia [-8, -3, -3, -6], que par este código imprime?
int best = 0;
int total = 0;
for (int i = 0; i < values.size(); i++) {
int n = values.get(i);
total += n;
if (n >= values.get(best)) {
best = i;
}
}
System.out.println(best + ": " + (double) total / values.size());
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
O método é chamado com {“Birch”, “Cedar”, “Maple”} e o alvo “Maple”. O que ele retorna?
static int find(String[] a, String target) {
for (int i = 0; i < a.length; i++) {
if (a[i].equals(target)) return i;
else return -1;
}
return -1;
}
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Qual lista resta após este laço?
ArrayList<Integer> a = new ArrayList<>(List.of(4, 4, 7, 2));
for (int i = 0; i < a.size(); i++) {
if (a.get(i) % 2 == 0) a.remove(i);
}
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
"Count: " + 2 + 6 produz?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
String code = "AB:472:Q";, qual é o resultado de code.substring(code.indexOf(":") + 1, code.lastIndexOf(":"))?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
"Mina;18;Oslo".split(";")?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Quantos campos esta expressão produz?
"x,y,,".split(",")
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
O que é impresso?
String[] p = " Omar, 12, 5 ".trim().split(",");
int distanceKm = Integer.parseInt(p[1].trim());
int hours = Integer.parseInt(p[2].trim());
double speed = distanceKm / hours;
System.out.println(speed);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 3: Compare valores e diagnostique erros10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
reply, que pode ser null, contém exatamente “ready”?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
sb.append(3), que texto ele contém?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
"18".compareTo("4") < 0 e por quê?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Que texto está armazenado em result?
StringBuilder sb = new StringBuilder("plane");
sb.delete(1, 3);
sb.insert(1, "i");
String result = sb.toString();
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
O que este código imprime?
String label = "lamp";
String other = label;
label = label.toUpperCase();
System.out.println(other + ":" + label);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
O que isto imprime?
String[] a = {"ax", "beta", "brim", "sun"};
int first = -1;
int matches = 0;
for (int i = 0; i < a.length; i++) {
if (a[i].startsWith("b")) {
if (first == -1) first = i;
matches++;
}
}
System.out.println(first + ":" + matches);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Qual lista resta após este código?
ArrayList<Integer> a = new ArrayList<>(List.of(2, 5, 2));
for (int i = a.size() - 1; i >= 0; i--) {
if (a.get(i) == 2) a.remove(i);
}
int n = a.size();
for (int i = 0; i < n; i++) {
a.add(a.get(i) * 2);
}
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Quais são a e b após a execução do código?
int[] a = {11, 4, 8};
int[] b = a;
int temp = b[0];
b[0] = b[2];
b[2] = temp;
b = Arrays.copyOf(b, 4);
b[1] = 0;
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
names.indexOf("Iris") >= 0 antes de chamar get com esse resultado. O que acontece?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
O que é impresso?
StringBuilder a = new StringBuilder("drawer");
StringBuilder b = a;
String result = b.reverse().toString();
b = new StringBuilder("x");
System.out.println(a + ":" + result);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 4: Combine operações de coleções e texto10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
" ".isEmpty() e " ".isBlank(), nessa ordem?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Quais são as partes resultantes desta expressão?
" north east west ".trim().split("\\s+")
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
["zen", "Able", "apple"]. Um laço mantém o primeiro candidato e o substitui quando name.compareTo(first) < 0. Qual nome permanece?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
ArrayList<String> tem tamanho 4. O que acontece quando add(4, "new") é seguido de get(4)?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Quais são a lista out final e a média?
int[] a = {-2, 6, 10, 0};
ArrayList<Integer> out = new ArrayList<>();
int sum = 0;
for (int n : a) {
if (n > 0) {
out.add(n);
sum += n;
}
}
double average = (double) sum / out.size();
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Qual índice é retornado para a entrada mostrada?
static int firstLong(String[] words, int min) {
for (int i = 0; i < words.length; i++) {
String clean = words[i].trim();
if (clean.length() >= min) return i;
}
return -1;
}
// Call:
firstLong(new String[] {" ox ", "pine", " map ", "cedar"}, 4)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Quais são a e kept após este código?
ArrayList<Integer> a = new ArrayList<>(List.of(2, -1, -1, 5));
ArrayList<Integer> kept = new ArrayList<>(a);
for (int i = kept.size() - 1; i >= 0; i--) {
if (kept.get(i) < 0) kept.remove(i);
}
a.set(0, 9);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
O método deve retornar o texto após o primeiro “#” ou “missing” quando não houver marcador. Qual substituição faz o método funcionar para as duas entradas “tag#blue” e “plain”?
static String tail(String s) {
int p = s.indexOf("#");
MISSING
}
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Qual String o método retorna para o vetor {“A”, “B”, “C”}?
static String report(String[] parts) {
StringBuilder sb = new StringBuilder();
for (int i = parts.length - 1; i >= 0; i--) {
if (sb.length() > 0) sb.append("/");
sb.append(parts[i]);
}
sb.deleteCharAt(2);
return sb.toString();
}
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Quais são a e b após change(a)?
static void change(ArrayList<String> x) {
x.remove("red");
x = new ArrayList<>();
x.add("gold");
}
// In main:
ArrayList<String> a = new ArrayList<>(List.of("red", "blue", "red"));
ArrayList<String> b = a;
change(a);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Travou em uma questão sua? Ajuda com Tarefas
Termos-Chave
A
Acréscimo ao final (append)
Acumulador
Alteração no próprio objeto
reverse() muda o construtor de texto original, então apelidos de referência também veem o texto invertido.Análise e conversão de texto
Integer.parseInt falha porque esse método aceita texto inteiro sem separador decimal.Apelido de referência
b = a, b é um apelido de referência de a; b.clear() esvazia a lista lida por ambas as variáveis.B
Busca sequencial
C
Cadeia de caracteres (String)
Campo
Campo length
new int[4] é 4 mesmo antes de o programa escrever valores personalizados em suas posições.Caracteres de espaço em branco
Character.isWhitespace, também usado por strip() e isBlank().Classe ArrayList
Classe empacotadora
Integer permite que um ArrayList<Integer> armazene números fornecidos como valores int.Classe StringBuilder
Comparação com distinção entre maiúsculas e minúsculas
equals de String determina que “Go” e “go” têm conteúdos diferentes.Comparação de conteúdo
reply.equals("go") reconhece texto correspondente mesmo quando os objetos são diferentes.Comparação de identidade
a == b é falsa para vetores separados que contêm os mesmos inteiros.Concatenação
+ ocorre da esquerda para a direita, a menos que parênteses alterem o agrupamento."N=" + 2 + 5 produzir "N=25", pois os números são unidos depois que o texto começa.Contagem condicional
Cópia de vetor
Arrays.copyOf(a, 5) pode ampliar o armazenamento sem alterar o comprimento de a.Cópia superficial
D
Desempacotamento
int first = numbers.get(0); lê um elemento Integer da lista.Divisão de texto (split)
Divisão inteira
17 / 4 ser igual a 4; converter explicitamente um operando antes permite obter o resultado fracionário 4,25.E
Empacotamento automático
numbers.add(8) mesmo que o tipo dos elementos da lista seja Integer, não int.Encadeamento de métodos
sb.append("x").append(2), mas não pode continuar a partir de setCharAt, que retorna void.Exceção ArrayIndexOutOfBoundsException
Exceção ConcurrentModificationException
Exceção NumberFormatException
Integer.parseInt(" 18") porque o espaço inicial não é aceito.Expressão regular
F
Filtro
Í
Índice
get(3) lê esse elemento.I
Igualdade de conteúdo
Arrays.equals(a, b), não com o equals do vetor.Imutabilidade
toUpperCase().Inicializador de vetor
int[] a = {3, 6, 9}; cria três posições contendo esses valores.Iterador
it.remove() enquanto continua percorrendo a lista.J
Junção de texto (join)
String.join("/", pieces) transforma as partes “a”, “b” e “c” no texto “a/b/c”.L
Laço com índice
names.get(i) e exibindo i + 1.Laço for-each
Limite do laço
i < a.length - 1 deixa espaço para ler o vizinho à direita em a[i + 1].Limite final exclusivo
substring(2, 5) inclui as posições 2, 3 e 4, mas deixa de fora a posição 5.Lista não modificável
List.of("east", "west") rejeita uma chamada posterior a set.M
Máximo
{-7, -2, -5} é -2, valor que uma variável de melhor valor inicializada em zero não informaria.Método compareTo
Método sobrecarregado
Modificação estrutural
N
Não é um número (NaN)
0.0 / 0 produz NaN em vez de uma medida útil.null
length() em uma String que uma busca possa retornar.O
Ordem lexicográfica
P
Palíndromo
Passagem por valor
Percurso
Predicado de busca
city.startsWith("M") encontra nomes por uma condição em vez de um valor exato.R
Referência
Remoção em ordem inversa
Remoção por índice
[a, b, c] em [a, c] quando remove(1) exclui o elemento do meio.Remoção por valor
[a, b, a] depois que remove("a") remove o primeiro a.Resultado da busca
names.indexOf("Kai") pode ser 0, então um teste de valor encontrado deve aceitar esse índice.Retorno antecipado
S
Subcadeia de caracteres
"planet" é selecionada com substring(1, 4) e resulta em “lan”.Substituição literal
replace(".", "-") transforma os pontos em “a.b.c” em hífens.T
Tipo char
"book".charAt(0) é 'b', enquanto "b" é uma String de comprimento 1.U
Unidade de código UTF-16
length() de String.V
Valor padrão
Valor sentinela
Variável temporária
Vetor
- 1Primeiros programas em Java
- 2Condições e laços em Java
- 3Métodos em Java
- 4Listas e vetores em Java
- 5Classes e objetos em Java
- 6Objetos e referências em Java
- 7HashMaps e coleções em Java
- 8Herança, interfaces e polimorfismo em Java
- 9Exceções em Java
- 10Pacotes e testes unitários em Java
- 11Genéricos e expressões lambda em Java
Sobre esta aula
Crie seus próprios Materiais de Estudo
Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.