- 1 1. Introdução: Por Que a Busca de Strings é Importante em Java
- 2 2. Sintaxe Básica e Características do Método contains()
- 3 3. Exemplos de Uso Prático e Considerações Importantes
- 4 4. Métodos Frequentemente Comparados com contains()
- 5 5. Casos de Uso Comuns e Código de Exemplo
- 5.1 5-1. Validação de Entrada do Usuário (Detecção de Palavras Proibidas)
- 5.2 5-2. Análise de Arquivos de Log (Detectando Mensagens Específicas)
- 5.3 5-3. Filtrando Strings em uma Lista (Usando Stream API)
- 5.4 5-4. Analisando Cabeçalhos de Requisição HTTP ou URLs
- 5.5 5-5. Verificando Caminhos de Arquivo ou Extensões
- 5.6 Considerações Práticas
- 6 6. Considerações de Desempenho
- 7 7. Comparação com Outras Linguagens de Programação
- 8 8. Perguntas Frequentes (FAQ)
- 8.1 Q1. O contains() é sensível a maiúsculas e minúsculas?
- 8.2 Q2. Como posso verificar correspondências parciais usando expressões regulares?
- 8.3 Q3. O que acontece se eu chamar contains() em null?
- 8.4 Q4. O que acontece se eu passar uma string vazia (“”) para contains()?
- 8.5 Q5. contains() pode buscar múltiplas palavras‑chave de uma vez?
- 8.6 Q6. Quando devo usar contains() vs indexOf()?
- 9 9. Conclusão
1. Introdução: Por Que a Busca de Strings é Importante em Java
A manipulação de strings é uma das operações mais frequentemente usadas ao programar em Java.
Seja verificando entrada do usuário, analisando conteúdos de arquivos ou procurando por palavras-chave específicas, você frequentemente precisa determinar se uma palavra particular está contida em uma string dada.
Para atender a essas necessidades, o Java fornece um método conveniente chamado contains().
Com este método, você pode facilmente determinar se uma string contém parcialmente outra.
Por exemplo, se você quiser verificar se uma mensagem de erro contém uma palavra-chave específica, contains() permite que você faça isso em uma única linha de código.
Especialmente em cenários envolvendo grandes volumes de texto — como aplicativos web, processamento de API ou análise de logs — o método contains() melhora grandemente a legibilidade e a manutenibilidade do código.
No entanto, há também considerações importantes, como sensibilidade a maiúsculas e minúsculas e a possibilidade de null.
Este artigo explica o método contains() do Java em detalhes — desde o uso básico e erros comuns até diferenças de outros métodos e aplicações práticas.
Nosso objetivo é fornecer informações úteis não apenas para iniciantes, mas também para desenvolvedores que usam ativamente o Java em projetos do mundo real.
2. Sintaxe Básica e Características do Método contains()
O método contains() do Java determina se uma string contém parcialmente outra string.
Sua sintaxe é muito simples, no entanto é altamente prática e usada frequentemente em tarefas de programação do dia a dia.
Sintaxe Básica
boolean result = targetString.contains(searchString);
O método pertence à classe String e aceita um CharSequence (comumente uma String) como seu argumento.
Seu valor de retorno é boolean: true se a string de destino contém a subcadeia dada, e false caso contrário.
Código de Exemplo
String message = "Java programming is fun!";
boolean hasKeyword = message.contains("programming");
System.out.println(hasKeyword); // Output: true
No exemplo acima, a subcadeia "programming" está presente na string de destino, então contains() retorna true.
Características do Método
- Verifica apenas correspondência parcial: Se você precisar de uma correspondência exata, use
equals()em vez disso. - Sensitivo a maiúsculas e minúsculas: Por exemplo,
"Java"e"java"são tratados como diferentes (detalhes explicados mais adiante). - Não suporta expressões regulares: Porque simplesmente verifica a presença de uma string, a correspondência de padrões requer
matches()ou a classePattern.
Comportamento Quando null É Passado
Passar null para contains() aciona uma NullPointerException.
Por exemplo, o código a seguir lançará uma exceção:
String text = null;
System.out.println(text.contains("test")); // Exception occurs
Da mesma forma, se a string de destino em si for null, a mesma exceção será lançada.
Portanto, é altamente recomendado realizar verificações de null antes de chamar contains().
3. Exemplos de Uso Prático e Considerações Importantes
O método contains() do Java é muito intuitivo e conveniente, mas o uso incorreto pode levar a bugs inesperados ou código ineficiente.
Esta seção explica o uso básico de contains() junto com pontos chave dos quais você deve estar ciente.
3-1. Exemplo de Uso Básico
O código a seguir demonstra um exemplo simples de verificação se a string de destino contém uma palavra-chave específica:
String sentence = "今日はJavaの勉強をしています。";
if (sentence.contains("Java")) {
System.out.println("Javaが含まれています。");
} else {
System.out.println("Javaは含まれていません。");
}
Como mostrado, contains() é frequentemente combinado com instruções if para realizar ramificação condicional.
3-2. Sensibilidade a Maiúsculas e Minúsculas
O método contains() é sensitivo a maiúsculas e minúsculas.
Por exemplo, o código a seguir retorna false:
String text = "Welcome to Java";
System.out.println(text.contains("java")); // false
Em tais casos, é comum converter as strings para minúsculas (ou maiúsculas) antes da comparação:
String text = "Welcome to Java";
System.out.println(text.toLowerCase().contains("java")); // true
Essa abordagem ajuda a eliminar diferenças de maiúsculas e minúsculas na entrada (por exemplo, entrada do usuário).
3-3. Tratamento de null e Strings Vazias
Uma das considerações mais importantes ao usar contains() é o tratamento de null.
Se a string de destino ou o argumento for null, ocorrerá uma NullPointerException.
String text = null;
System.out.println(text.contains("test")); // Runtime error
Para evitar esse problema, sempre adicione uma verificação de null:
if (text != null && text.contains("test")) {
// Safe to process
}
Observe também:
Passar uma string vazia ("") sempre retorna true.
String sample = "test";
System.out.println(sample.contains("")); // true
No entanto, esse comportamento é raramente útil na prática e pode levar a bugs involuntários se strings vazias forem passadas acidentalmente.
3-4. Não Suporta Buscas por Múltiplas Palavras-Chave
contains() pode verificar apenas uma palavra-chave por vez.
Para verificar múltiplas palavras-chave, você deve chamar contains() várias vezes ou usar a API de Stream.
String target = "エラーコード123:アクセス拒否";
if (target.contains("エラー") || target.contains("拒否")) {
System.out.println("問題のあるメッセージです。");
}
Ou, para conjuntos de palavras-chave dinâmicos:
List<String> keywords = Arrays.asList("エラー", "障害", "失敗");
boolean found = keywords.stream().anyMatch(target::contains);
4. Métodos Frequentemente Comparados com contains()
O Java fornece vários métodos para comparar strings ou verificar se uma subcadeia específica existe.
Entre eles, contains() é usado para “correspondência parcial”, mas outros métodos também servem para propósitos semelhantes.
Esta seção explica as características e diferenças desses métodos para ajudá-lo a usá-los de forma apropriada.
4-1. Diferença em Relação a equals(): Correspondência Exata vs. Correspondência Parcial
equals() determina se duas strings são exatamente idênticas.
Em contraste, contains() verifica correspondências parciais.
String a = "Java";
String b = "Java";
System.out.println(a.equals(b)); // true: Exact match
System.out.println(a.contains("av")); // true: Partial match
Principais diferenças:
| Comparison | equals() | contains() |
|---|---|---|
| Match Type | Exact match | Partial match |
| Case Sensitivity | Sensitive | Sensitive |
| Argument Type | Object | CharSequence |
Diretriz de Uso: Use equals() quando os valores devem corresponder exatamente (por exemplo, verificação de ID).
Use contains() quando correspondências parciais são aceitáveis (por exemplo, busca por palavras-chave).
4-2. Diferença em Relação a indexOf(): Se Você Precisa da Posição
O método indexOf() também pode ser usado para verificar se uma subcadeia existe dentro de uma string.
A diferença é que indexOf() retorna o índice inicial da subcadeia se encontrada.
Se a subcadeia não for encontrada, retorna -1.
String text = "Hello, Java World!";
System.out.println(text.indexOf("Java")); // 7
System.out.println(text.indexOf("Python")); // -1
Você também pode usar indexOf() para replicar o comportamento de contains():
if (text.indexOf("Java") >= 0) {
System.out.println("It is contained.");
}
Diretriz de Uso: Se você não precisar do índice, contains() é mais legível e preferível.
4-3. Diferença em Relação a matches(): Suporte a Expressões Regulares
O método matches() verifica se uma string corresponde completamente a uma expressão regular dada.
Em contraste, contains() verifica apenas correspondências de subcadeias literais e não suporta regex.
String text = "abc123";
System.out.println(text.matches(".*123")); // true
System.out.println(text.contains(".*123")); // false (not regex)
Se você quiser correspondência parcial baseada em regex, use a classe Pattern:
4-4. Resumo da Comparação de Recursos
| Method | Purpose | Return Type | Regex Support | Use Case |
|---|---|---|---|---|
contains() | Partial match | boolean | No | Keyword search |
equals() | Exact match | boolean | No | ID/password checks |
indexOf() | Get match position | int | No | Index-based processing |
matches() | Regex match | boolean | Yes | Find pattern-based strings |
5. Casos de Uso Comuns e Código de Exemplo
O método contains() do Java é simples, mas amplamente usado em cenários de desenvolvimento reais.
Casos de uso típicos incluem validação de entrada do usuário, análise de logs e operações de filtragem.
Esta seção cobre exemplos práticos com código correspondente.
5-1. Validação de Entrada do Usuário (Detecção de Palavras Proibidas)
Em formulários ou aplicativos de chat, pode ser necessário detectar se certas palavras proibidas estão incluídas.
String input = "このアプリは最悪だ";
String banned = "最悪";
if (input.contains(banned)) {
System.out.println("不適切な言葉が含まれています。");
}
Manipulando múltiplas palavras NG:
List<String> bannedWords = Arrays.asList("最悪", "バカ", "死ね");
for (String word : bannedWords) {
if (input.contains(word)) {
System.out.println("不適切な言葉が含まれています: " + word);
break;
}
}
5-2. Análise de Arquivos de Log (Detectando Mensagens Específicas)
Ao analisar logs de sistema ou de aplicação, você pode querer extrair apenas as linhas que contenham palavras‑chave específicas como ERROR ou WARN.
List<String> logs = Arrays.asList(
"[INFO] サーバーが起動しました",
"[ERROR] データベース接続失敗",
"[WARN] メモリ使用率が高い"
);
for (String log : logs) {
if (log.contains("ERROR")) {
System.out.println("エラー発生ログ: " + log);
}
}

5-3. Filtrando Strings em uma Lista (Usando Stream API)
Ao lidar com grandes conjuntos de dados, use Stream API para extrair apenas os elementos que contenham uma substring específica:
List<String> users = Arrays.asList("tanaka@example.com", "sato@gmail.com", "yamada@yahoo.co.jp");
List<String> gmailUsers = users.stream()
.filter(email -> email.contains("@gmail.com"))
.collect(Collectors.toList());
System.out.println(gmailUsers); // [sato@gmail.com]
5-4. Analisando Cabeçalhos de Requisição HTTP ou URLs
No desenvolvimento web, roteamento ou tratamento específico de dispositivos pode exigir a verificação de substrings no User-Agent ou na URL.
String userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)";
if (userAgent.contains("iPhone")) {
System.out.println("スマートフォンからのアクセスです。");
}
5-5. Verificando Caminhos de Arquivo ou Extensões
Para determinar o tipo de um arquivo usando seu caminho:
String filePath = "/usr/local/data/sample.csv";
if (filePath.contains(".csv")) {
System.out.println("CSVファイルです。");
}
Nota: Para verificações de extensão de arquivo, endsWith(".csv") costuma ser mais preciso.
Considerações Práticas
- Aplique normalização (ex.:
toLowerCase(),trim()) quando a precisão for necessária. - Para dados em grande escala, considere a Stream API ou expressões regulares.
- Lembre‑se de que
contains()faz correspondência parcial—combine com outras condições para uma lógica mais segura.
6. Considerações de Desempenho
Embora o método contains() ofereça excelente legibilidade e simplicidade, você deve considerar seu impacto de desempenho ao lidar com grandes conjuntos de dados ou executar operações repetidas.
Esta seção explica o custo de processamento do contains() e abordagens alternativas para melhorar a eficiência.
6-1. Comportamento Interno e Complexidade de Tempo do contains()
O método contains() pesquisa a string alvo sequencialmente a partir do início para localizar a substring.
Internamente, ele depende do método indexOf(), e sua complexidade de tempo no pior caso é:
O(n * m) – n = comprimento da string alvo – m = comprimento da string de busca
Exemplo de processamento intensivo:
for (String line : hugeTextList) {
if (line.contains("error")) {
// processing
}
}
Isso pode afetar significativamente o desempenho quando repetido dentro de grandes loops.
6-2. Técnicas para Melhorar o Desempenho em Pesquisas Frequentes
Ao usar contains() repetidamente em grandes conjuntos de dados, as técnicas a seguir podem melhorar a velocidade de processamento:
• Converta todas as strings para minúsculas antecipadamente
Em vez de chamar toLowerCase() a cada comparação, normalize as strings previamente:
List<String> normalizedList = originalList.stream()
.map(String::toLowerCase)
.collect(Collectors.toList());
• Use a Stream API com parallel() para processamento paralelo
Utilize os núcleos da CPU para acelerar as buscas:
List<String> result = hugeTextList.parallelStream()
.filter(line -> line.contains("keyword"))
.collect(Collectors.toList());
• Use expressões regulares para padrões de busca complexos
Se as condições forem complexas e puderem ser expressas em um regex, Pattern pode ter melhor desempenho:
Pattern pattern = Pattern.compile("error|fail|fatal");
for (String log : logs) {
if (pattern.matcher(log).find()) {
// matched
}
}
6-3. Considerações sobre Eficiência de Memória e Reutilização
Operações que convertem strings com frequência — como toLowerCase() ou substring() — podem gerar muitos objetos de string desnecessários, afetando o uso de memória.
Isso é particularmente importante para aplicativos de longa execução ou processamento no lado do servidor.
Pontos principais:
- Evite criar instâncias de string desnecessárias.
- Para conjuntos de dados grandes, considere o uso de buffering ou processamento em chunks.
- O cache de resultados repetidos de
contains()pode melhorar o desempenho em certos casos.
7. Comparação com Outras Linguagens de Programação
O método contains() do Java oferece uma correspondência de subcadeia simples e confiável, mas outras linguagens fornecem recursos semelhantes com suas próprias características.
Esta seção compara a verificação de subcadeias em Python, JavaScript e C# para destacar diferenças e semelhanças.
7-1. Python: Correspondência Parcial Simples com o Operador in
No Python, você pode verificar a inclusão de subcadeia usando o operador in:
text = "Hello, Python!"
if "Python" in text:
print("含まれています")
Essa sintaxe é extremamente legível — quase como linguagem natural — e requer aprendizado mínimo. Diferenças e Notas:
iné um operador da linguagem, não um método.- O Python também é sensível a maiúsculas e minúsculas para comparação de strings.
Noneproduz uma exceção; verificações de nulo são necessárias.
7-2. JavaScript: Correspondência Parcial com includes()
No JavaScript (ES6+), você pode usar o método includes():
const text = "JavaScript is fun";
console.log(text.includes("fun")); // true
Esse método é muito semelhante ao contains() do Java e é fácil de migrar mentalmente. Diferenças e Notas:
- Passar
undefinednão gera uma exceção; simplesmente retornafalse. includes()também funciona em arrays, aumentando sua versatilidade.
7-3. C#: Contains() Similar ao Java
O C# também oferece um método Contains() com comportamento semelhante ao do Java:
string text = "Welcome to C#";
bool result = text.Contains("C#");
Diferenças e Notas:
- O
Contains()do C# é sensível a maiúsculas e minúsculas por padrão, mas você pode ignorar o caso usandoStringComparison.OrdinalIgnoreCase. - Passar null aciona
ArgumentNullException.
7-4. Tabela de Comparação Entre Linguagens
| Language | Example Syntax | Case Sensitivity | Notes |
|---|---|---|---|
| Java | "abc".contains("a") | Sensitive | Throws exception on null |
| Python | "a" in "abc" | Sensitive | Most intuitive syntax |
| JavaScript | "abc".includes("a") | Sensitive | Also works for arrays |
| C# | "abc".Contains("a") | Sensitive (configurable) | Comparison mode can be chosen |
Resumo: Escolha a Sintaxe Certa para o Seu Caso de Uso
Embora a verificação de subcadeias seja um requisito comum em várias linguagens, cada linguagem fornece seu próprio método ou sintaxe.
O contains() do Java oferece estabilidade e clareza, tornando-o bem adequado para sistemas empresariais e aplicativos mantíveis.
Linguagens como Python e JavaScript oferecem sintaxe mais simples e concisa, o que pode ser ideal para scripts leves ou prototipagem rápida.
Ao entender tanto os conceitos comuns quanto os recursos específicos de cada linguagem, você poderá escrever código mais seguro e eficiente em várias linguagens.
8. Perguntas Frequentes (FAQ)
A seguir, estão perguntas comuns sobre o método contains() do Java — ajudando você a entender pontos complicados e evitar armadilhas comuns.
Q1. O contains() é sensível a maiúsculas e minúsculas?
Sim, ele é sensível a maiúsculas e minúsculas. Por exemplo, "Java".contains("java") retorna false. Solução:
String input = "Welcome to Java";
boolean result = input.toLowerCase().contains("java");
Q2. Como posso verificar correspondências parciais usando expressões regulares?
O contains() não suporta expressões regulares.
Use matches() ou a classe Pattern em vez disso. Exemplo (verificando padrão numérico):
import java.util.regex.Pattern;
import java.util.regex.Matcher;
String text = "注文番号: A123456";
Pattern pattern = Pattern.compile("A\d+");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println("パターンに一致しました。");
}
Q3. O que acontece se eu chamar contains() em null?
Uma NullPointerException será lançada.
String target = null;
System.out.println(target.contains("test")); // Error
Solução:
if (target != null && target.contains("test")) {
System.out.println("含まれています。");
}
Q4. O que acontece se eu passar uma string vazia (“”) para contains()?
Sempre retorna true.
String text = "Java";
System.out.println(text.contains("")); // true
Embora faça parte da especificação oficial, esse comportamento raramente é útil e pode causar bugs inesperados se strings vazias não forem desejadas.
Q5. contains() pode buscar múltiplas palavras‑chave de uma vez?
Não. Cada chamada verifica apenas uma palavra‑chave.
String text = "本日はシステムエラーが発生しました";
if (text.contains("エラー") || text.contains("障害") || text.contains("失敗")) {
System.out.println("問題が検出されました。");
}
Abordagem dinâmica:
List<String> keywords = Arrays.asList("エラー", "障害", "失敗");
boolean found = keywords.stream().anyMatch(text::contains);
Q6. Quando devo usar contains() vs indexOf()?
contains() retorna um boolean, enquanto indexOf() retorna um índice numérico.
- Use
contains()quando você simplesmente quer saber se a substring existe. - Use
indexOf()quando também precisa da posição.String text = "Error: Disk full"; if (text.contains("Error")) { int pos = text.indexOf("Error"); System.out.println("Position: " + pos); }
9. Conclusão
O método contains() do Java é uma ferramenta poderosa e conveniente para determinar se uma substring específica está contida dentro de uma string.
É amplamente usado em diversos cenários, como validação de entrada do usuário, análise de logs e filtragem de dados.
Neste artigo, abordamos:
- Sintaxe básica e valores de retorno
- Sensibilidade a maiúsculas/minúsculas e como tratá‑la
- Tratamento de nulls e strings vazias
- Diferenças em relação a outros métodos de comparação de strings
- Casos de uso práticos: validação, busca em logs, processamento com Stream
- Considerações de desempenho e técnicas de otimização
- Comparação com Python, JavaScript e C#
- Perguntas frequentes e dicas de solução de problemas
Embora contains() seja intuitivo e versátil, seu uso deve ser avaliado cuidadosamente em casos que envolvem grandes volumes de dados, chamadas frequentes ou condições de busca complexas.
Ao combinar normalização, processamento paralelo, expressões regulares e estratégias de cache, você pode manter tanto o desempenho quanto a legibilidade.
Como contains() é fundamental para trabalhar com strings em Java, esperamos que este artigo ajude você a utilizá‑lo de forma mais segura e eficaz em seus projetos de desenvolvimento.

