Listas, vetores e cadeias de caracteres em Java

Aprenda a armazenar vários valores em Java e a trabalhar com texto. Crie ArrayLists e vetores, adicione, altere, remova e busque seus elementos e processe-os com laços com índice e laços for-each para calcular totais, médias e valores máximos. Depois, trabalhe com texto usando métodos de String: localize e extraia trechos, divida linhas em campos, compare cadeias de caracteres corretamente com equals e construa textos mais longos com eficiência usando StringBuilder.

BásicoAula 4 de 11 do curso Curso de Programação orientada a objetos com Java

O que você vai aprender

  1. 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 índice
      Importe 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 lista
      Remova 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étodos
      Explique 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.
  2. 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 elementos
      Declare 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 listas
      Explique referências a vetores, copie e compare vetores corretamente, troque elementos e decida quando um vetor ou um ArrayList atende à tarefa.
  3. 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-each
      Escreva 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 extremos
      Use 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 vetor
      Escreva 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 percurso
      Remova ou adicione elementos durante um laço sem pular elementos ou causar uma exceção e escolha uma maneira segura de fazê-lo.
  4. 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 caracteres
      Use 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 caracteres
      Localize 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úmeros
      Divida uma linha em campos com split, converta campos em números e números em texto, verifique as partes e una-as novamente.
  5. 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 compareTo
      Use 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 StringBuilder
      Use 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.

Guia de estudo de Listas e vetores em Java

5 capítulos

1

Armazene 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.

TarefaChamadaÍndice válido
Ler um elementoget(i)0 até size() - 1
Substituir um elementoset(i, value)0 até size() - 1
Inserir um elementoadd(i, value)0 até size()
Acrescentar um elementoadd(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.
  • set substitui; add com índice insere e desloca os elementos seguintes.
  • Use tipos empacotadores como Integer em 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
ChamadaSignificadoResultado retornado
remove(int index)Remove o elemento em uma posiçãoO elemento removido
remove(Object value)Remove o primeiro valor igualtrue 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.
  • indexOf e lastIndexOf retornam -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.
  • equals de listas compara conteúdos ordenados; == compara identidade.
  • Uma lista vazia permite iteração; null não se refere a nenhuma lista.
2

Armazene 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.

EstruturaNúmero de elementosLeitura de um elemento
Vetora.lengtha[i]
ArrayLista.size()a.get(i)
Strings.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 e a.length para 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
NecessidadeEscolha adequada
Uma posição fixa para cada dia ou mêsVetor
Valores primitivos sem objetos empacotadoresVetor
Adicionar ou remover elementos conforme chegam dadosArrayList

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; copyOf ou clone cria uma cópia.
  • Use Arrays.equals para 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.
3

Processe 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 + 1 exige i < 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 remove de 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.
4

Trabalhe 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ãoResultado
"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 em length() - 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 Character testam 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étodoEfeito
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.
  • replace substitui texto literal; trim e strip atuam nas extremidades.
  • isBlank aceita texto composto apenas de espaços em branco, enquanto isEmpty exige 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

  • split retorna 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.join para partes de texto e métodos de conversão para números.
5

Compare 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çãoSinalMotivo
"apple".compareTo("banana")NegativoO primeiro char diferente vem antes
"pear".compareTo("pear")ZeroTodos os caracteres correspondem
"car".compareTo("carpet")NegativoPrefixo 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 equals para conteúdo de String e equalsIgnoreCase para ignorar maiúsculas e minúsculas.
  • Um literal conhecido pode receber equals com 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étodoEfeito
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 append para construir um resultado longo e toString para 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.
  • setCharAt retorna void, então não pode ser encadeado.
  • reverse altera 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

5 Lições Interativas

1

Construa e compartilhe uma lista de leitura

13 passos
Crie uma lista, acompanhe as mudanças em suas posições e decida quais alterações são compartilhadas por outra variável.
  1. 1
    Introduçã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.

  2. 2
    ExplicaçãoCrie a coleção vazia

    Importe java.util.ArrayList e 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.

  3. 3
    ExemploInsira 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 em old. A lista final é [Orbit, Cloud, Forest]. Diferentemente da inserção, a substituição não alterou o tamanho.

  4. 4
    DesafioEncontre a próxima posição válida

    A lista é [Orbit, Cloud, Forest]. O que acontece se você chamar reading.add(3, "Dune")? O que reading.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.

  5. 5
    Explicaçã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] e removed é verdadeiro. Forest e todos os elementos seguintes se deslocam uma posição para a esquerda. O último Cloud permanece na lista.

  6. 6
    DicaPergunte se existe ou onde está

    Para [Orbit, Forest, Dune, Cloud], contains("Orbit") é verdadeiro e indexOf("Orbit") é 0. Um teste de valor encontrado deve aceitar o índice 0: use index != -1 apó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". Use lastIndexOf quando a última posição correspondente importar.

  7. 7
    DesafioRemova 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.

  8. 8
    AnalogiaDois 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ão shared.add("Coast") é visível por meio de reading. Um construtor de cópia, new ArrayList<>(reading), cria outra lista com suas próprias posições.

  9. 9
    ExemploCopie 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.

  10. 10
    Ideia-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. Atribuir titles = 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. Chamar size() em uma lista vazia retorna 0, enquanto chamá-lo por meio de null falha.

  11. 11
    DesafioSepare 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.

  12. 12
    DesafioCombine cópia, busca e edição

    Considere que a contém [Lake, Hill] e execute b = new ArrayList<>(a), b.add("Lake") e b.remove(b.indexOf("Lake")). O que a e b contêm, e a.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ão equals de listas retorna falso.

  13. 13
    RecapitulaçãoPreveja uma alteração na lista

    Interprete uma edição identificando primeiro seu alvo: uma posição para set ou remoção por índice, um valor para remoção por valor e uma posição de inserção para add. 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.

2

Armazene e copie leituras em posições fixas

10 passos
Use posições fixas de vetor, examine valores padrão e preserve dados durante cópias e trocas.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoDê a cada leitura uma posição fixa
  2. 2
    ExplicaçãoAloque as posições
  3. 3
    ExemploImprima os dados necessários
  4. 4
    DesafioLeia a última posição
  5. 5
    ExemploAcompanhe um apelido de referência
  6. 6
    ExemploCrie uma cópia maior
  7. 7
    DesafioEscolha uma comparação de conteúdo
  8. 8
    ExemploGuarde antes de sobrescrever
  9. 9
    DesafioMantenha os dados antigos ao ampliar
  10. 10
    RecapitulaçãoSepare edições de posições da criação de armazenamento
3

Transforme leituras em resultados

17 passos
Acompanhe o estado do laço, calcule uma média, busque por uma condição e remova valores indesejados com segurança.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoDê a cada laço uma tarefa clara
  2. 2
    ExplicaçãoLeia valores ou leia posições
  3. 3
    DesafioDeixe espaço para um vizinho
  4. 4
    ExemploMantenha uma soma ao longo do laço
  5. 5
    ExemploDivida preservando a parte fracionária
  6. 6
    Ideia-chaveUm valor extremo precisa de um candidato real
  7. 7
    DesafioAcompanhe o último máximo empatado
  8. 8
    ExplicaçãoPare somente quando a resposta for conhecida
  9. 9
    ExemploEncontre a primeira leitura acima de um limite
  10. 10
    DesafioPasse da primeira correspondência para todas
  11. 11
    ExemploObserve um elemento pulado na remoção em ordem direta
  12. 12
    ExplicaçãoPercorra em ordem inversa para remover
  13. 13
    ConexãoPreserve a origem com filtragem
  14. 14
    DicaUse o iterador responsável pelo percurso
  15. 15
    DesafioDefina o limite de um laço que acrescenta elementos
  16. 16
    DesafioCalcule a média apenas dos valores selecionados
  17. 17
    RecapitulaçãoAcompanhe o estado e as regras de parada
4

Leia um registro de texto em etapas

14 passos
Examine caracteres, extraia uma parte identificada e divida um registro em campos numéricos.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoDo texto bruto aos dados
  2. 2
    ExplicaçãoLeia um caractere por vez
  3. 3
    ExemploConte algarismos em um rótulo
  4. 4
    DesafioGuarde uma transformação
  5. 5
    ExplicaçãoLocalize primeiro um limite
  6. 6
    ExemploConte as posições incluídas
  7. 7
    DicaEscolha a regra de limpeza
  8. 8
    DesafioTrate um separador ausente
  9. 9
    ExplicaçãoDivida o registro em campos
  10. 10
    ExemploConverta e calcule
  11. 11
    Ideia-chaveSeparadores podem descrever padrões
  12. 12
    DesafioConverta após verificar a estrutura
  13. 13
    DesafioNormalize palavras e una-as
  14. 14
    RecapitulaçãoVerifique o tipo do resultado em cada etapa
5

Compare comandos e monte um relatório

12 passos
Escolha comparações de conteúdo, interprete a ordem do texto e construa um resultado editável sem perder o original.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoCompare significados e construa um resultado
  2. 2
    ExplicaçãoEscolha um teste de conteúdo
  3. 3
    ExemploIgnore maiúsculas e minúsculas sem ignorar espaços
  4. 4
    DesafioExplique um teste baseado em literais
  5. 5
    ExplicaçãoOrdene pelo primeiro char diferente
  6. 6
    DesafioMantenha o candidato que vem primeiro
  7. 7
    ExplicaçãoAcrescente a uma sequência modificável
  8. 8
    ExemploColoque separadores entre as partes
  9. 9
    ExemploEdite as posições atuais
  10. 10
    DesafioMantenha a ordem original
  11. 11
    DesafioConstrua um relatório filtrado
  12. 12
    RecapitulaçãoUse a operação adequada à pergunta

Questões de Listas e vetores em Java

40 Questões de Prática em 4 conjuntos

Conjunto 1: Crie, edite e compartilhe coleções10 Questões de Prática

Questão 1 de 10

Qual declaração cria uma lista vazia e modificável de valores inteiros? Considere que ArrayList e List foram importados.
  1. ArrayList<int> n = new ArrayList<>();
  2. Integer[] n = new Integer[0];
  3. ArrayList<Integer> n = new ArrayList<>();
  4. List<Integer> n = List.of();
Mostrar respostaOcultar resposta
Resposta: C
O tipo empacotador 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);
  1. ruler: [pen, tape, clip]
  2. tape: [pen, clip, ruler]
  3. ruler: [pen, clip, tape]
  4. clip: [pen, tape, clip]
Mostrar respostaOcultar resposta
Resposta: A
Inserir no índice 1 desloca "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

Um ArrayList<Integer> contém [12, 24, 36]. Qual chamada remove o valor 24?
  1. values.remove(24);
  2. values.remove(Integer.valueOf(1));
  3. values.set(1, 24);
  4. values.remove(Integer.valueOf(24));
Mostrar respostaOcultar resposta
Resposta: D
Empacotar 24 com 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

Uma lista de nomes contém [Nora, Ravi, Nora, Mei]. Após names.remove("Nora"), quais são os resultados de names.indexOf("Nora") e names.lastIndexOf("Mei"), nessa ordem?
  1. 0 and 3
  2. 1 and 2
  3. -1 and 2
  4. 2 and 3
Mostrar respostaOcultar resposta
Resposta: B
A remoção por valor exclui apenas a primeira "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");
  1. a: [oak]; c: [ash]
  2. a: [oak, elm]; c: [ash]
  3. a: [ash, elm]; c: [ash, elm]
  4. a: [oak, elm]; c: [ash, elm]
Mostrar respostaOcultar resposta
Resposta: B
A atribuição a 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

O que Arrays.toString(new boolean[3]) retorna?
  1. "[null, null, null]"
  2. "[0, 0, 0]"
  3. "[]"
  4. "[false, false, false]"
Mostrar respostaOcultar resposta
Resposta: D
Um novo vetor booleano tem três posições, cada uma inicializada como 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

Um double[] readings tem comprimento 6. Qual expressão lê sua última posição?
  1. readings[5]
  2. readings[6]
  3. readings.get(5)
  4. readings[readings.length()]
Mostrar respostaOcultar resposta
Resposta: A
Seis posições de vetor usam índices de 0 a 5, então a última posição é 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;
  1. a: [8, 3]; b: [8, 3, 0]
  2. a: [7, 3]; b: [8, 3]
  3. a: [7, 3]; b: [8, 3, 0]
  4. a: [7, 3, 0]; b: [8, 3, 0]
Mostrar respostaOcultar resposta
Resposta: C
A cópia é um novo vetor de três posições, com a posição int extra inicializada como 0. Alterar sua primeira posição deixa o vetor original de duas posições inalterado. Mostrar 8 em a confundiria a cópia com a referência compartilhada criada por b = a.

Questão 9 de 10

Dois vetores criados separadamente contêm, cada um, {6, 2}. Quais são os resultados de a.equals(b) e Arrays.equals(a, b), nessa ordem?
  1. false, true
  2. true, true
  3. true, false
  4. false, false
Mostrar respostaOcultar resposta
Resposta: A
O 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);
  1. [5, 8]
  2. [7, 8, 9]
  3. [7, 8]
  4. [5, 8, 9]
Mostrar respostaOcultar resposta
Resposta: C
O 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

Após for (int n : values) { n += 3; } no vetor {2, 6, 9}, o que o vetor contém?
  1. [5, 9, 12]
  2. [3, 3, 3]
  3. [9, 9, 9]
  4. [2, 6, 9]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma lista de inteiros contém [5, 8, 9]. Após somá-la em um int total, que valor (double) (total / values.size()) produz?
  1. 7.333333333333333
  2. 7.0
  3. 22.0
  4. 3.0
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());
  1. 2: -5.0
  2. 1: -5.0
  3. 2: -3.0
  4. 0: -5.0
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;
}
  1. 0
  2. 2
  3. -1
  4. 3
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);
}
  1. [7]
  2. [4, 7]
  3. [4, 7, 2]
  4. [4, 4, 7]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

O que "Count: " + 2 + 6 produz?
  1. "Count: 26"
  2. "Count: 8"
  3. "8Count: "
  4. "Count: 2 6"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Para String code = "AB:472:Q";, qual é o resultado de code.substring(code.indexOf(":") + 1, code.lastIndexOf(":"))?
  1. ":472"
  2. "472:"
  3. "47"
  4. "472"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Qual é o tipo retornado por "Mina;18;Oslo".split(";")?
  1. ArrayList<String>
  2. String
  3. String[]
  4. int[]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Quantos campos esta expressão produz?

"x,y,,".split(",")
  1. 3
  2. 4
  3. 2
  4. 1
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);
  1. 2.4
  2. 12.5
  3. NumberFormatException
  4. 2.0
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

Qual expressão verifica com segurança se uma String chamada reply, que pode ser null, contém exatamente “ready”?
  1. reply.equals("ready")
  2. "ready".equals(reply)
  3. reply == "ready"
  4. reply.compareTo("ready") == 0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um construtor de texto contém “note”. Após sb.append(3), que texto ele contém?
  1. "note"
  2. "3note"
  3. "note 3"
  4. "note3"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Qual é o resultado de "18".compareTo("4") < 0 e por quê?
  1. true; the first character decides the order
  2. false; eighteen is greater than four
  3. true; two-character strings always come first
  4. false; the longer string always comes later
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();
  1. "pie"
  2. "pilane"
  3. "pine"
  4. "pline"
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);
  1. Ambas as variáveis mantêm o texto original em minúsculas.
  2. Ambas as variáveis se referem ao resultado em maiúsculas.
  3. O original passa a maiúsculas; o novo resultado permanece em minúsculas.
  4. O original permanece em minúsculas; a variável reatribuída passa a maiúsculas.
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);
  1. 1:2
  2. 2:2
  3. 1:1
  4. -1:2
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);
}
  1. [5, 2, 10, 4]
  2. [5]
  3. [5, 10]
  4. [2, 5, 2, 4, 10, 4]
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;
  1. a: [11, 4, 8]; b: [8, 0, 11, 0]
  2. a: [8, 4, 11]; b: [8, 0, 11, 0]
  3. a: [8, 0, 11]; b: [8, 0, 11, 0]
  4. a: [8, 4, 8]; b: [8, 0, 8, 0]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma lista está vazia. Um programa testa names.indexOf("Iris") >= 0 antes de chamar get com esse resultado. O que acontece?
  1. O teste é falso, então a chamada de get é pulada.
  2. O teste é verdadeiro, e get retorna null.
  3. indexOf lança uma exceção porque a lista está vazia.
  4. O teste é verdadeiro, e get lança uma exceção.
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);
  1. drawer:reward
  2. x:reward
  3. reward:reward
  4. reward:drawer
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

Quais são os resultados de " ".isEmpty() e " ".isBlank(), nessa ordem?
  1. true, true
  2. false, false
  3. false, true
  4. true, false
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+")
  1. [north, east, west]
  2. [, north, east, west]
  3. [north, , , east, west]
  4. [north east west]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma lista não vazia de nomes contém ["zen", "Able", "apple"]. Um laço mantém o primeiro candidato e o substitui quando name.compareTo(first) < 0. Qual nome permanece?
  1. apple, porque a comparação ignora maiúsculas e minúsculas
  2. Able, porque seu primeiro char precede os minúsculos
  3. zen, porque os candidatos seguintes nunca vêm antes dele
  4. Nenhum candidato, porque comparar maiúsculas e minúsculas lança uma exceção
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um ArrayList<String> tem tamanho 4. O que acontece quando add(4, "new") é seguido de get(4)?
  1. The insertion throws; get is never reached.
  2. The insertion succeeds; get throws afterward.
  3. The insertion replaces the old final element.
  4. The insertion succeeds; get returns "new".
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();
  1. [6, 10] and 4.0
  2. [6, 10] and 8.0
  3. [-2, 6, 10, 0] and 3.5
  4. [6, 10, 0] and 5.333333333333333
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)
  1. 0
  2. 3
  3. -1
  4. 1
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);
  1. a: [9, -1, -1, 5]; kept: [2, 5]
  2. a: [9, 5]; kept: [9, 5]
  3. a: [9, -1, -1, 5]; kept: [9, 5]
  4. a: [9, -1, -1, 5]; kept: [2, -1, 5]
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
}
  1. if (p == 0) return "missing"; return s.substring(p + 1);
  2. if (p == -1) return "missing"; return s.substring(p);
  3. if (p == -1) return "missing"; return s.substring(p + 1);
  4. if (p > 0) return "missing"; return s.substring(p + 1);
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();
}
  1. "C/B/A"
  2. "C/BA"
  3. "A//C"
  4. "C//A"
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);
  1. a: [gold]; b: [blue, red]
  2. a: [blue, red]; b: [blue, red]
  3. a: [blue]; b: [blue]
  4. a: [red, blue, red]; b: [red, blue, red]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

66 Termos-Chave, cada um com sua definição

A

Acréscimo ao final (append)
Uma operação de acréscimo ao final adiciona a representação textual de um valor ao fim de um StringBuilder e retorna esse mesmo construtor para novas chamadas.
Acrescentar 4 após “Page ” altera o construtor de texto para “Page 4” sem uma reatribuição separada.
Acumulador
Um acumulador armazena um resultado construído ao longo das passagens de um laço, começando antes do laço e mudando conforme os elementos relevantes são processados.
Um acumulador de soma começa em 0 e adiciona cada distância para que o programa possa informar o total de quilômetros.
Alteração no próprio objeto
Uma alteração no próprio objeto muda o estado de um objeto existente, de modo que referências que já apontam para ele observem o conteúdo alterado.
Uma alteração no próprio objeto com 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
A análise e conversão de texto transforma texto em um valor estruturado, como int ou double, conforme a sintaxe aceita pelo método escolhido.
Converter “3.5” com Integer.parseInt falha porque esse método aceita texto inteiro sem separador decimal.
Apelido de referência
Um apelido de referência é outra variável ou nome que se refere ao mesmo objeto, de modo que edições por um nome sejam visíveis pelo outro.
Após b = a, b é um apelido de referência de a; b.clear() esvazia a lista lida por ambas as variáveis.

B

Busca sequencial
Uma busca sequencial verifica elementos um a um até que uma correspondência responda à pergunta ou que o fim estabeleça que nenhum elemento corresponde.
Uma busca sequencial por um nome ausente em 14 entradas verifica todas as 14 antes de retornar seu marcador de falha.

C

Cadeia de caracteres (String)
Uma String é um objeto Java imutável que representa texto como uma sequência de valores char de UTF-16 acessados por posições que começam em zero.
Uma String contendo um nome pode ser compartilhada com segurança porque converter suas letras para maiúsculas ou minúsculas não edita o objeto original.
Campo
Um campo é uma parte de dados em um registro, frequentemente separada das partes vizinhas por um delimitador, como uma vírgula ou um ponto e vírgula.
O segundo campo de “Ari,18,4” deve ser convertido se um programa precisar de seu valor numérico para um cálculo.
Campo length
O campo length informa o número fixo de posições de um vetor e é lido sem os parênteses usados em uma chamada de método.
O campo length em new int[4] é 4 mesmo antes de o programa escrever valores personalizados em suas posições.
Caracteres de espaço em branco
Caracteres de espaço em branco são caracteres de espaçamento ou separação reconhecidos por um determinado teste, incluindo espaços, tabulações e quebras de linha.
Os caracteres de espaço em branco de Java são reconhecidos por Character.isWhitespace, também usado por strip() e isBlank().
Classe ArrayList
Um ArrayList é uma lista ordenada e modificável cuja quantidade de elementos cresce ou diminui conforme valores são adicionados ou removidos.
Um ArrayList pode coletar nomes conforme as pessoas os digitam sem exigir uma contagem final antecipada.
Classe empacotadora
Uma classe empacotadora representa um valor primitivo como um objeto, permitindo que valores como inteiros sejam usados como elementos de lista.
A classe empacotadora Integer permite que um ArrayList<Integer> armazene números fornecidos como valores int.
Classe StringBuilder
Um StringBuilder é uma sequência modificável de caracteres que permite acréscimos repetidos eficientes e edições nas posições ou intervalos atuais.
Um StringBuilder pode montar um relatório de várias linhas sem reconstruir todo o prefixo após cada linha adicionada.
Comparação com distinção entre maiúsculas e minúsculas
Uma comparação com distinção entre maiúsculas e minúsculas trata letras maiúsculas e minúsculas como diferentes ao decidir se textos correspondem.
Uma comparação com distinção entre maiúsculas e minúsculas usando equals de String determina que “Go” e “go” têm conteúdos diferentes.
Comparação de conteúdo
Uma comparação de conteúdo testa caracteres ou valores armazenados em objetos, permitindo que objetos String separados correspondam quando seus textos são iguais.
Uma comparação de conteúdo com reply.equals("go") reconhece texto correspondente mesmo quando os objetos são diferentes.
Comparação de identidade
Uma comparação de identidade verifica se referências identificam o mesmo objeto, independentemente de objetos separados conterem dados iguais.
Uma comparação de identidade com a == b é falsa para vetores separados que contêm os mesmos inteiros.
Concatenação
A concatenação une valores em texto; em Java, a adição de String com + ocorre da esquerda para a direita, a menos que parênteses alterem o agrupamento.
A concatenação faz "N=" + 2 + 5 produzir "N=25", pois os números são unidos depois que o texto começa.
Contagem condicional
Uma contagem condicional registra quantos elementos passam em um teste, adicionando um a um contador somente quando o teste é satisfeito.
Uma contagem condicional pode registrar quantas temperaturas diárias ultrapassam 30 graus Celsius.
Cópia de vetor
Uma cópia de vetor é um vetor separado preenchido a partir de um vetor existente, opcionalmente com comprimento diferente e posições extras preenchidas com valores padrão.
Uma cópia de vetor criada com Arrays.copyOf(a, 5) pode ampliar o armazenamento sem alterar o comprimento de a.
Cópia superficial
Uma cópia superficial cria um contêiner separado e copia os valores ou referências de seus elementos sem duplicar os objetos referenciados.
Uma cópia superficial de uma lista de cadeias de caracteres tem posições de lista independentes que ainda se referem aos mesmos objetos String.

D

Desempacotamento
O desempacotamento é a conversão automática, por Java, do valor armazenado em um objeto empacotador para o tipo primitivo correspondente.
O desempacotamento fornece um int quando int first = numbers.get(0); lê um elemento Integer da lista.
Divisão de texto (split)
Uma operação de divisão de texto divide o texto nas correspondências de um padrão separador e retorna um vetor de partes de texto sem os próprios separadores.
Uma divisão em vírgulas transforma “Nia,25,Lima” em três cadeias de caracteres, incluindo o texto numérico ainda não convertido.
Divisão inteira
A divisão inteira divide operandos inteiros e descarta a parte fracionária, mesmo quando o quociente resultante é posteriormente armazenado como double.
A divisão inteira faz 17 / 4 ser igual a 4; converter explicitamente um operando antes permite obter o resultado fracionário 4,25.

E

Empacotamento automático
O empacotamento automático é a conversão automática, por Java, de um valor primitivo em um objeto de sua classe empacotadora correspondente.
O empacotamento automático permite numbers.add(8) mesmo que o tipo dos elementos da lista seja Integer, não int.
Encadeamento de métodos
O encadeamento de métodos chama outro método diretamente em um resultado retornado por uma chamada anterior, como quando append retorna o mesmo construtor de texto.
O encadeamento de métodos permite sb.append("x").append(2), mas não pode continuar a partir de setCharAt, que retorna void.
Exceção ArrayIndexOutOfBoundsException
Uma ArrayIndexOutOfBoundsException informa uma tentativa de ler ou escrever uma posição de vetor fora de seu intervalo válido de índices.
Uma ArrayIndexOutOfBoundsException ocorre quando o código lê o índice 4 de um vetor de quatro elementos.
Exceção ConcurrentModificationException
Uma ConcurrentModificationException pode informar que uma coleção mudou de uma forma que seu iterador ativo não estava preparado para acompanhar.
Uma ConcurrentModificationException pode ocorrer em uma única thread quando o corpo de um for-each remove elementos de sua lista de origem.
Exceção NumberFormatException
Uma NumberFormatException informa que o texto não pode ser convertido para o tipo numérico usando o método de conversão solicitado.
Uma NumberFormatException resulta de Integer.parseInt(" 18") porque o espaço inicial não é aceito.
Expressão regular
Uma expressão regular é um padrão de texto cujos símbolos podem descrever correspondências além de caracteres literais exatos, como nos separadores de split de String.
Uma expressão regular contendo um ponto sem escape corresponde a caracteres em vez de dividir apenas em pontos literais.

F

Filtro
Um filtro seleciona elementos que satisfazem uma condição e pode coletá-los em uma nova lista, deixando a coleção original inalterada.
Um filtro mantém palavras de comprimento mínimo cinco adicionando as correspondentes a uma lista de resultado separada.

Í

Índice
Um índice é uma posição numerada a partir de zero que identifica um elemento em uma lista, vetor ou cadeia de caracteres; a primeira posição é 0.
O índice do último elemento de uma lista de quatro elementos é 3, então get(3) lê esse elemento.

I

Igualdade de conteúdo
A igualdade de conteúdo verifica se contêineres têm elementos correspondentes iguais na mesma ordem, sem exigir que sejam um único objeto compartilhado.
Para vetores int, a igualdade de conteúdo é testada com Arrays.equals(a, b), não com o equals do vetor.
Imutabilidade
A imutabilidade significa que o estado armazenado de um objeto não pode mudar após a criação, de modo que transformações de String retornam resultados sem editá-lo.
A imutabilidade de String deixa inalterado um apelido de referência antigo quando outra variável guarda o resultado de toUpperCase().
Inicializador de vetor
Um inicializador de vetor fornece valores de elementos quando um vetor é criado, e a quantidade de valores determina o comprimento do vetor.
O inicializador de vetor em int[] a = {3, 6, 9}; cria três posições contendo esses valores.
Iterador
Um iterador acompanha o percurso de uma coleção, fornecendo o próximo valor e permitindo a remoção por meio de seu próprio método.
Um Iterator pode remover o número par recém-lido com it.remove() enquanto continua percorrendo a lista.

J

Junção de texto (join)
Uma operação de junção de texto combina partes de texto em uma String com um separador escolhido colocado entre as partes, em vez de após a última.
Uma junção com String.join("/", pieces) transforma as partes “a”, “b” e “c” no texto “a/b/c”.

L

Laço com índice
Um laço com índice visita elementos por meio de uma variável de posição explícita, permitindo que o corpo leia posições ou substitua valores armazenados.
Um laço com índice pode imprimir nomes com números de linha lendo names.get(i) e exibindo i + 1.
Laço for-each
Um laço for-each visita o valor de cada elemento em ordem sem um índice explícito, colocando esse valor em uma variável local do laço.
Um laço for-each pode somar valores de um vetor, mas reatribuir sua variável int não substitui as posições do vetor.
Limite do laço
Um limite do laço é um limite na condição de um laço que determina quais posições ou iterações o corpo pode processar.
Um limite de laço i < a.length - 1 deixa espaço para ler o vizinho à direita em a[i + 1].
Limite final exclusivo
Um limite final exclusivo marca a primeira posição deixada fora de um intervalo, fazendo com que o número de posições incluídas seja igual ao fim menos o início.
O limite final exclusivo 5 em substring(2, 5) inclui as posições 2, 3 e 4, mas deixa de fora a posição 5.
Lista não modificável
Uma lista não modificável rejeita alterações em seus elementos e em sua estrutura, incluindo adição, remoção e substituição.
A lista não modificável retornada por List.of("east", "west") rejeita uma chamada posterior a set.

M

Máximo
Um máximo é o maior valor em um conjunto de dados não vazio; um laço pode manter o melhor valor até o momento ou o índice em que ele aparece.
O máximo de {-7, -2, -5} é -2, valor que uma variável de melhor valor inicializada em zero não informaria.
Método compareTo
O método compareTo informa um valor negativo, zero ou positivo conforme a ordem do objeto receptor em relação ao argumento.
O compareTo de String usa valores char de UTF-16, então um resultado abaixo de zero significa que o objeto receptor vem primeiro.
Método sobrecarregado
Um método sobrecarregado é um entre vários métodos com o mesmo nome, mas com tipos ou quantidades de parâmetros diferentes.
O método sobrecarregado de remoção selecionado por um argumento int trata esse argumento como um índice.
Modificação estrutural
Uma modificação estrutural altera o tamanho ou a estrutura interna de um ArrayList, como ao adicionar ou remover um elemento durante o percurso.
Uma modificação estrutural por meio da lista de origem pode invalidar o estado de seu iterador for-each.

N

Não é um número (NaN)
NaN significa “não é um número” e é um resultado em ponto flutuante para operações como dividir um total zero por uma contagem zero.
Uma média de dados vazios calculada como 0.0 / 0 produz NaN em vez de uma medida útil.
null
null é o valor de referência que não identifica nenhum objeto, de modo que um método de instância não pode ser chamado por meio dessa referência.
Um resultado null deve ser verificado antes que o código chame length() em uma String que uma busca possa retornar.

O

Ordem lexicográfica
A ordem lexicográfica compara sequências em sua primeira posição diferente, colocando uma cadeia de caracteres mais curta com o mesmo prefixo antes de uma mais longa.
A ordem lexicográfica de Java coloca “12” antes de “8” porque os primeiros chars diferentes são '1' e '8'.

P

Palíndromo
Um palíndromo é lido da mesma forma nos dois sentidos segundo a regra de comparação escolhida, como ignorar maiúsculas, minúsculas e caracteres que não sejam letras.
Uma verificação de palíndromo pode normalizar letras, inverter um novo construtor de texto e comparar as Strings resultantes.
Passagem por valor
A passagem por valor significa que um parâmetro de método recebe uma cópia do valor de um argumento, incluindo uma referência copiada para um objeto.
A passagem por valor permite que um parâmetro de lista edite elementos compartilhados, mas mantém local a reatribuição do parâmetro.
Percurso
Um percurso é uma visita sistemática aos elementos de uma coleção, como passar do primeiro elemento ao último com um laço.
Um percurso em ordem inversa começa no último índice e chega ao índice 0 antes de o laço terminar.
Predicado de busca
Um predicado de busca é um teste verdadeiro ou falso que decide se um elemento satisfaz uma condição de busca, como um prefixo exigido.
O predicado de busca city.startsWith("M") encontra nomes por uma condição em vez de um valor exato.

R

Referência
Uma referência é um valor que identifica um objeto, permitindo que uma variável alcance esse objeto em vez de armazenar seu conteúdo diretamente.
Uma referência copiada permite que duas variáveis adicionem elementos ao mesmo objeto ArrayList na memória.
Remoção em ordem inversa
A remoção em ordem inversa visita os índices de uma lista do último ao primeiro, de modo que a exclusão desloque apenas elementos que o laço já verificou.
A remoção em ordem inversa exclui valores negativos adjacentes sem pular aquele que se desloca para a esquerda após a exclusão.
Remoção por índice
A remoção por índice exclui o elemento em uma posição dada, retorna esse elemento e desloca todos os elementos seguintes para a esquerda.
A remoção por índice transforma [a, b, c] em [a, c] quando remove(1) exclui o elemento do meio.
Remoção por valor
A remoção por valor exclui o primeiro elemento igual e retorna se um elemento correspondente foi de fato removido.
A remoção por valor deixa uma duplicata em [a, b, a] depois que remove("a") remove o primeiro a.
Resultado da busca
Um resultado da busca informa se ou onde dados correspondentes foram encontrados; buscas por índice em listas usam -1 para indicar ausência de correspondência.
O resultado da busca de names.indexOf("Kai") pode ser 0, então um teste de valor encontrado deve aceitar esse índice.
Retorno antecipado
Um retorno antecipado encerra um método assim que seu resultado é conhecido, como quando uma busca pela primeira correspondência alcança um elemento correspondente.
Um retorno antecipado de dentro do if correspondente evita verificar nomes após a primeira correspondência encontrada.

S

Subcadeia de caracteres
Uma subcadeia de caracteres é uma parte contígua de uma String, selecionada por um índice inicial e, opcionalmente, um índice final que é excluído.
A subcadeia dos índices 1 a 3 de "planet" é selecionada com substring(1, 4) e resulta em “lan”.
Substituição literal
Uma substituição literal substitui texto ou caracteres exatamente correspondentes sem interpretar o alvo como um padrão de expressão regular.
Uma substituição literal com replace(".", "-") transforma os pontos em “a.b.c” em hífens.

T

Tipo char
Um char é um valor primitivo de Java que armazena uma unidade de código UTF-16, escrito como um literal de caractere entre aspas simples.
O char retornado por "book".charAt(0) é 'b', enquanto "b" é uma String de comprimento 1.

U

Unidade de código UTF-16
Uma unidade de código UTF-16 é a unidade armazenada por um char de Java; um símbolo exibido pode precisar de uma unidade ou de um par delas.
Um emoji pode ocupar duas unidades de código UTF-16, afetando a contagem retornada por length() de String.

V

Valor padrão
Um valor padrão é o valor inicial que Java atribui a uma posição de vetor recém-criada, como zero, false ou null, conforme seu tipo.
O valor padrão em cada posição de um novo vetor de String é null, então nenhum método de String pode ser executado nela ainda.
Valor sentinela
Um valor sentinela é um resultado escolhido especialmente para marcar uma condição, como a ausência de correspondência, distinto dos resultados comuns de sucesso.
O valor sentinela -1 indica que uma busca por índice falhou porque nenhum índice válido pode ser negativo.
Variável temporária
Uma variável temporária armazena um valor intermediário enquanto outras atribuições alteram as posições das quais esse valor foi lido.
Uma variável temporária guarda o primeiro elemento durante uma troca para que a próxima atribuição não o perca.
Vetor
Um vetor é um objeto com um número fixo de posições do mesmo tipo, acessadas por índices que começam em zero e usam colchetes.
Um vetor de sete doubles pode armazenar uma temperatura em graus Celsius para cada dia de uma semana.

Sobre esta aula

Por StudeliRelatar um erro

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.

Começar