Como Verificar se uma String é Igual a Outra em Java

JavaBeginner
Pratique Agora

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.

  1. Abra o arquivo HelloJava.java no editor WebIDE, caso ainda não esteja aberto.

  2. 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, str2 e str3.
    • str1 e str2 sã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 construtor new 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.
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. 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.java

    Se a compilação for bem-sucedida, você não verá nenhuma saída. Um arquivo StringComparison.class será criado no diretório ~/project.

  5. Finalmente, execute o programa compilado usando o comando java:

    java StringComparison

    Você 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

    Observe que str1.equals(str2) e str1.equals(str3) retornam true porque o conteúdo das strings é o mesmo. No entanto, str1 == str3 retorna false porque str1 e str3 se referem a objetos string diferentes na memória, embora contenham os mesmos caracteres. str1 == str2 retorna true neste 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.

  1. Abra o arquivo StringComparison.java no editor WebIDE.

  2. Modifique o método main para incluir uma string null:

    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 null str4.
    • Comentamos as linhas que causariam um NullPointerException se 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á chamando equals() não é null antes de chamar o método. Um padrão comum é (stringVariable != null && stringVariable.equals(anotherString)). Alternativamente, você pode chamar equals() na string conhecida como não nula, se possível, como "hello".equals(str4).
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. Compile o programa modificado no Terminal:

    javac StringComparison.java
  5. Execute o programa compilado:

    java StringComparison

    Você 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

    A saída mostra que as comparações seguras lidam corretamente com a string null sem causar um erro. A comparação entre str1 e str4 (que é nula) avalia corretamente como false.

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().

  1. Abra o arquivo StringComparison.java no editor WebIDE.

  2. 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 str5 e str6 com diferentes casos.
    • Adicionamos novas instruções de impressão para demonstrar a diferença entre equals() e equalsIgnoreCase().
    • Também mostramos que chamar equalsIgnoreCase() em uma string não nula com um argumento null não causa um erro, semelhante a equals(). No entanto, chamar equalsIgnoreCase() em uma variável de string null ainda resultará em um NullPointerException.
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. Compile o programa no Terminal:

    javac StringComparison.java
  5. Execute o programa compilado:

    java StringComparison

    Você 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(): false

    A saída mostra claramente que equalsIgnoreCase() retorna true ao comparar strings com os mesmos caracteres, mas com casos diferentes, enquanto equals() retorna false.

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().