Introdução
Neste laboratório, você aprenderá como comparar strings de forma eficaz em Java. Compreender a comparação de strings é fundamental para várias tarefas de programação. Exploraremos o método padrão equals() para verificar se duas strings possuem a mesma sequência de caracteres, mesmo que sejam objetos diferentes na memória.
Além disso, você aprenderá como lidar com potenciais problemas de NullPointerException ao comparar strings que podem ser nulas. Por fim, abordaremos o método equalsIgnoreCase(), que permite realizar comparações de strings sem distinção entre maiúsculas e minúsculas, proporcionando flexibilidade quando a capitalização dos caracteres não importa para a lógica de comparação.
Comparar Strings Usando o Método equals()
Nesta etapa, aprenderemos como comparar strings em Java usando o método equals(). Comparar strings é uma operação fundamental na programação, e entender como fazê-lo corretamente é crucial.
Em Java, strings são objetos, não tipos de dados primitivos como inteiros ou booleanos. Isso significa que, ao comparar strings, você está comparando os próprios objetos, não apenas seus valores. Usar o operador == para comparar strings verifica se as duas variáveis de string se referem ao mesmo objeto na memória. No entanto, frequentemente você deseja verificar se duas strings possuem a mesma sequência de caracteres, mesmo que sejam objetos diferentes. Para isso, você deve usar o método equals().
Vamos criar um programa Java simples para demonstrar isso.
Abra o arquivo
HelloJava.javano editor WebIDE, caso ainda não esteja aberto.Substitua todo o conteúdo do arquivo pelo seguinte código:
public class StringComparison { public static void main(String[] args) { String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); System.out.println("Comparing str1 and str2 using equals(): " + str1.equals(str2)); System.out.println("Comparing str1 and str3 using equals(): " + str1.equals(str3)); System.out.println("Comparing str1 and str2 using ==: " + (str1 == str2)); System.out.println("Comparing str1 and str3 using ==: " + (str1 == str3)); } }Neste código:
- Declaramos três variáveis de string:
str1,str2estr3. str1estr2são criadas usando literais de string. Java frequentemente otimiza literais de string para que literais idênticos se refiram ao mesmo objeto.str3é criada usando o construtornew String(), que cria explicitamente um novo objeto string na memória, mesmo que seu conteúdo seja o mesmo que os literais existentes.- Usamos
equals()para comparar o conteúdo das strings. - Usamos
==para comparar se as variáveis de string se referem ao mesmo objeto.
- Declaramos três variáveis de string:
Salve o arquivo (Ctrl+S ou Cmd+S).
Agora, vamos compilar nosso programa. Abra o Terminal na parte inferior do WebIDE e certifique-se de estar no diretório
~/project. Execute o seguinte comando:javac StringComparison.javaSe a compilação for bem-sucedida, você não verá nenhuma saída. Um arquivo
StringComparison.classserá criado no diretório~/project.Finalmente, execute o programa compilado usando o comando
java:java StringComparisonVocê deve ver uma saída semelhante a esta:
Comparing str1 and str2 using equals(): true Comparing str1 and str3 using equals(): true Comparing str1 and str2 using ==: true Comparing str1 and str3 using ==: falseObserve que
str1.equals(str2)estr1.equals(str3)retornamtrueporque o conteúdo das strings é o mesmo. No entanto,str1 == str3retornafalseporquestr1estr3se referem a objetos string diferentes na memória, embora contenham os mesmos caracteres.str1 == str2retornatrueneste caso específico devido à otimização de literais de string, mas confiar em==para comparação de strings é geralmente desencorajado, pois pode levar a resultados inesperados.
Isso demonstra por que usar o método equals() é a maneira correta de comparar o conteúdo de strings em Java.
Tratamento de Strings Nulas na Verificação de Igualdade
Nesta etapa, exploraremos como lidar com strings null ao realizar verificações de igualdade em Java. Uma string null significa que a variável de string não se refere a nenhum objeto. Tentar chamar um método em uma variável null resultará em uma NullPointerException, que é um erro comum em Java.
Ao comparar strings, é importante considerar a possibilidade de que uma ou ambas as strings possam ser null. Se você chamar o método equals() em uma string null, seu programa travará.
Vamos modificar nosso programa anterior para ver como isso funciona e como lidar com isso com segurança.
Abra o arquivo
StringComparison.javano editor WebIDE.Modifique o método
mainpara incluir uma stringnull:public class StringComparison { public static void main(String[] args) { String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); String str4 = null; // Esta string é nula System.out.println("Comparing str1 and str2 using equals(): " + str1.equals(str2)); System.out.println("Comparing str1 and str3 using equals(): " + str1.equals(str3)); System.out.println("Comparing str1 and str2 using ==: " + (str1 == str2)); System.out.println("Comparing str1 and str3 using ==: " + (str1 == str3)); // Vamos tentar comparar com a string nula // System.out.println("Comparing str1 and str4 using equals(): " + str1.equals(str4)); // Esta linha causaria um NullPointerException // System.out.println("Comparing str4 and str1 using equals(): " + str4.equals(str1)); // Esta linha também causaria um NullPointerException // Maneira correta de comparar quando uma string pode ser nula System.out.println("Comparing str1 and str4 safely: " + (str1 != null && str1.equals(str4))); System.out.println("Comparing str4 and str1 safely: " + (str4 != null && str4.equals(str1))); System.out.println("Comparing str4 and null safely: " + (str4 == null)); } }No código modificado:
- Adicionamos uma string
nullstr4. - Comentamos as linhas que causariam um
NullPointerExceptionse executadas. - Adicionamos exemplos de como comparar strings com segurança quando uma pode ser
null. A maneira mais segura é verificar se a string na qual você está chamandoequals()não énullantes de chamar o método. Um padrão comum é(stringVariable != null && stringVariable.equals(anotherString)). Alternativamente, você pode chamarequals()na string conhecida como não nula, se possível, como"hello".equals(str4).
- Adicionamos uma string
Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa modificado no Terminal:
javac StringComparison.javaExecute o programa compilado:
java StringComparisonVocê deve ver uma saída semelhante a esta:
Comparing str1 and str2 using equals(): true Comparing str1 and str3 using equals(): true Comparing str1 and str2 using ==: true Comparing str1 and str3 using ==: false Comparing str1 and str4 safely: false Comparing str4 and str1 safely: false Comparing str4 and null safely: trueA saída mostra que as comparações seguras lidam corretamente com a string
nullsem causar um erro. A comparação entrestr1estr4(que é nula) avalia corretamente comofalse.
Esta etapa destaca a importância de lidar com valores null ao trabalhar com objetos em Java, especialmente strings, para evitar erros de NullPointerException.
Usar equalsIgnoreCase() para Comparação Case-Insensitive
Nesta etapa final, aprenderemos sobre o método equalsIgnoreCase(), que é usado para comparar strings sem considerar o caso dos caracteres. Isso é muito útil quando você deseja verificar se duas strings são iguais, independentemente de as letras serem maiúsculas ou minúsculas.
O método equals() que usamos nas etapas anteriores realiza uma comparação com distinção de maiúsculas e minúsculas. Isso significa que "hello" não é igual a "Hello" ao usar equals(). O método equalsIgnoreCase() ignora o caso, então "hello" e "Hello" seriam considerados iguais.
Vamos modificar nosso programa pela última vez para demonstrar equalsIgnoreCase().
Abra o arquivo
StringComparison.javano editor WebIDE.Adicione algumas novas variáveis de string com diferentes casos e use
equalsIgnoreCase()para compará-las:public class StringComparison { public static void main(String[] args) { String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); String str4 = null; String str5 = "Hello"; // Diferentes casos String str6 = "HELLO"; // Tudo em maiúsculas System.out.println("Comparing str1 and str2 using equals(): " + str1.equals(str2)); System.out.println("Comparing str1 and str3 using equals(): " + str1.equals(str3)); System.out.println("Comparing str1 and str2 using ==: " + (str1 == str2)); System.out.println("Comparing str1 and str3 using ==: " + (str1 == str3)); // Comparação segura com null System.out.println("Comparing str1 and str4 safely: " + (str1 != null && str1.equals(str4))); System.out.println("Comparing str4 and str1 safely: " + (str4 != null && str4.equals(str1))); System.out.println("Comparing str4 and null safely: " + (str4 == null)); System.out.println("\n--- Comparações Sem Distinção de Maiúsculas e Minúsculas ---"); System.out.println("Comparing str1 and str5 using equals(): " + str1.equals(str5)); System.out.println("Comparing str1 and str5 using equalsIgnoreCase(): " + str1.equalsIgnoreCase(str5)); System.out.println("Comparing str1 and str6 using equalsIgnoreCase(): " + str1.equalsIgnoreCase(str6)); System.out.println("Comparing str5 and str6 using equalsIgnoreCase(): " + str5.equalsIgnoreCase(str6)); // equalsIgnoreCase() também lida com null com segurança se chamado em uma string não nula System.out.println("Comparing str1 and str4 using equalsIgnoreCase(): " + str1.equalsIgnoreCase(str4)); // System.out.println("Comparing str4 and str1 using equalsIgnoreCase(): " + str4.equalsIgnoreCase(str1)); // Isso ainda causaria um NullPointerException } }No código atualizado:
- Adicionamos
str5estr6com diferentes casos. - Adicionamos novas instruções de impressão para demonstrar a diferença entre
equals()eequalsIgnoreCase(). - Também mostramos que chamar
equalsIgnoreCase()em uma string não nula com um argumentonullnão causa um erro, semelhante aequals(). No entanto, chamarequalsIgnoreCase()em uma variável de stringnullainda resultará em umNullPointerException.
- Adicionamos
Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa no Terminal:
javac StringComparison.javaExecute o programa compilado:
java StringComparisonVocê deve ver uma saída semelhante a esta:
Comparing str1 and str2 using equals(): true Comparing str1 and str3 using equals(): true Comparing str1 and str2 using ==: true Comparing str1 and str3 using ==: false Comparing str1 and str4 safely: false Comparing str4 and str1 safely: false Comparing str4 and null safely: true --- Comparações Sem Distinção de Maiúsculas e Minúsculas --- Comparing str1 and str5 using equals(): false Comparing str1 and str5 using equalsIgnoreCase(): true Comparing str1 and str6 using equalsIgnoreCase(): true Comparing str5 and str6 using equalsIgnoreCase(): true Comparing str1 and str4 using equalsIgnoreCase(): falseA saída mostra claramente que
equalsIgnoreCase()retornatrueao comparar strings com os mesmos caracteres, mas com casos diferentes, enquantoequals()retornafalse.
Você agora aprendeu como comparar strings em Java usando equals() para comparação com distinção de maiúsculas e minúsculas, como lidar com strings null com segurança e como usar equalsIgnoreCase() para comparação sem distinção de maiúsculas e minúsculas. Essas são habilidades essenciais para trabalhar com strings em Java.
Resumo
Neste laboratório, aprendemos como comparar strings em Java. Começamos entendendo a diferença entre comparar objetos string usando o operador == e comparar seu conteúdo usando o método equals(). Vimos que == verifica a identidade do objeto, enquanto equals() verifica a igualdade da sequência de caracteres.
Em seguida, exploramos como lidar com potenciais NullPointerException ao comparar strings, garantindo que a string na qual equals() é chamado não seja nula. Finalmente, aprendemos como realizar comparações de strings sem distinção de maiúsculas e minúsculas usando o método equalsIgnoreCase().



