Como verificar se um array contém um valor em Java? Analisamos os principais erros (e aprendemos com eles)
Imagine a situação: você está programando em Java, tem um array de strings (ou números) e precisa saber se um valor específico está presente. Parece simples, não é? Mas essa mesma pergunta (How do I determine whether an array contains a particular value in Java?) acumulou no Stack Overflow mais de meio milhão de visualizações. Milhares de desenvolvedores (de iniciantes a seniores) tropeçam nos mesmos erros.
Neste artigo, não vamos apenas dar uma resposta pronta. Vamos percorrer os 5 erros mais comuns que transformam uma tarefa simples em dor de cabeça. Você aprenderá por que Arrays.asList().contains() pode não funcionar, como fazer o Stream funcionar com primitivos e quando a busca binária se torna uma armadilha. Vamos lá!
Erro nº 1: Usar equals() para arrays (o principal desastre de iniciantes)
A falha mais comum é tentar chamar equals() ou contains() diretamente no array.
// ❌ ERRO FATALString[] fruits = {"apple", "banana", "orange"};System.out.println(fruits.equals("apple")); // falseSystem.out.println(fruits.contains("apple")); // Erro de compilação!Por que isso não funciona? Um array em Java é um objeto, mas não possui o método contains(). E o método equals() compara referências (endereços de memória), não o conteúdo. Seu array fruits é um objeto no heap, e a string "apple" é outro objeto. Eles nunca serão iguais.
Como fazer corretamente: Usar um loop ou utilitários de java.util.Arrays.
// ✅ CORRETO: Iteração manualString[] fruits = {"apple", "banana", "orange"};String target = "apple";boolean found = false;for (String fruit : fruits) { if (target.equals(fruit)) { found = true; break; }}System.out.println(found); // trueErro nº 2: Arrays.asList().contains() para arrays de primitivos
Uma solução enganosamente genial. Você lê no Stack Overflow a dica Arrays.asList(yourArray).contains(value) e a aplica alegremente a um array int[]. E obtém false.
// ❌ NÃO FUNCIONA PARA PRIMITIVOSint[] numbers = {1, 2, 3, 4, 5};List<Integer> list = Arrays.asList(numbers); // ATENÇÃO!System.out.println(list.contains(3)); // false Por quê? Arrays.asList() para um array primitivo int[] cria um List<int[]> (uma lista com um único elemento, o array), e não um List<Integer>. Você está verificando se a lista contém o array numbers com o número 3. Claro que não. A lista contém um único elemento: o próprio array {1,2,3,4,5}.
Como fazer corretamente: Para primitivos, use um loop, IntStream ou converta para uma lista de objetos.
// ✅ CORRETO: Usando IntStream (Java 8+)int[] numbers = {1, 2, 3, 4, 5};boolean found = IntStream.of(numbers).anyMatch(n -> n == 3);System.out.println(found); // true
// ✅ OU usando um loopboolean found2 = false;for (int num : numbers) { if (num == 3) { found2 = true; break; }}Erro nº 3: Uso ingênuo de binarySearch() sem ordenação
Arrays.binarySearch() é uma ferramenta poderosa, mas funciona apenas em arrays ordenados. Se você passar um array não ordenado, o resultado será imprevisível (frequentemente um número negativo, mesmo que o elemento exista).
// ❌ BUSCA BINÁRIA EM ARRAY NÃO ORDENADOString[] unsorted = {"banana", "apple", "orange"};int index = Arrays.binarySearch(unsorted, "apple");System.out.println(index); // Pode ser