Cómo comprobar si una cadena es igual a otra cadena en Java

JavaJavaBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo comparar cadenas de manera efectiva en Java. Comprender la comparación de cadenas es fundamental para diversas tareas de programación. Exploraremos el método estándar equals() para verificar si dos cadenas tienen la misma secuencia de caracteres, incluso si son objetos diferentes en la memoria.

Además, aprenderás cómo manejar posibles problemas de NullPointerException al comparar cadenas que pueden ser nulas. Finalmente, cubriremos el método equalsIgnoreCase(), que te permite realizar comparaciones de cadenas sin distinguir entre mayúsculas y minúsculas, brindando flexibilidad cuando el caso de los caracteres no importa para tu lógica de comparación.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/StringManipulationGroup -.-> java/strings("Strings") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/strings -.-> lab-559983{{"Cómo comprobar si una cadena es igual a otra cadena en Java"}} java/string_methods -.-> lab-559983{{"Cómo comprobar si una cadena es igual a otra cadena en Java"}} end

Comparar cadenas utilizando el método equals()

En este paso, aprenderemos cómo comparar cadenas en Java utilizando el método equals(). Comparar cadenas es una operación fundamental en la programación, y entender cómo hacerlo correctamente es crucial.

En Java, las cadenas son objetos, no tipos de datos primitivos como los enteros o los booleanos. Esto significa que cuando comparas cadenas, estás comparando los objetos en sí, no solo sus valores. Utilizar el operador == para comparar cadenas verifica si las dos variables de cadena se refieren al mismo objeto en la memoria. Sin embargo, a menudo quieres verificar si dos cadenas tienen la misma secuencia de caracteres, incluso si son objetos diferentes. Para esto, debes utilizar el método equals().

Vamos a crear un simple programa en Java para demostrar esto.

  1. Abre el archivo HelloJava.java en el editor WebIDE si no está abierto.

  2. Reemplaza todo el contenido del archivo con el siguiente 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));
        }
    }

    En este código:

    • Declaramos tres variables de cadena: str1, str2 y str3.
    • str1 y str2 se crean utilizando literales de cadena. Java a menudo optimiza los literales de cadena de modo que literales idénticos se refieran al mismo objeto.
    • str3 se crea utilizando el constructor new String(), que crea explícitamente un nuevo objeto de cadena en la memoria, incluso si su contenido es el mismo que los literales existentes.
    • Utilizamos equals() para comparar el contenido de las cadenas.
    • Utilizamos == para comparar si las variables de cadena se refieren al mismo objeto.
  3. Guarda el archivo (Ctrl+S o Cmd+S).

  4. Ahora, vamos a compilar nuestro programa. Abre la Terminal en la parte inferior del WebIDE y asegúrate de estar en el directorio ~/project. Ejecuta el siguiente comando:

    javac StringComparison.java

    Si la compilación es exitosa, no verás salida. Se creará un archivo StringComparison.class en el directorio ~/project.

  5. Finalmente, ejecuta el programa compilado utilizando el comando java:

    java StringComparison

    Debes ver una salida similar 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

    Observa que str1.equals(str2) y str1.equals(str3) devuelven true porque el contenido de las cadenas es el mismo. Sin embargo, str1 == str3 devuelve false porque str1 y str3 se refieren a diferentes objetos de cadena en la memoria, aunque contengan los mismos caracteres. str1 == str2 devuelve true en este caso específico debido a la optimización de literales de cadena, pero se desaconseja en general confiar en == para la comparación de cadenas, ya que puede llevar a resultados inesperados.

Esto demuestra por qué utilizar el método equals() es la forma correcta de comparar el contenido de cadenas en Java.

Manejar cadenas nulas en la comprobación de igualdad

En este paso, exploraremos cómo manejar cadenas null cuando se realizan comprobaciones de igualdad en Java. Una cadena null significa que la variable de cadena no se refiere a ningún objeto. Intentar llamar a un método en una variable null resultará en una NullPointerException, que es un error común en Java.

Al comparar cadenas, es importante considerar la posibilidad de que una o ambas cadenas puedan ser null. Si se llama al método equals() en una cadena null, el programa se detendrá.

Modifiquemos nuestro programa anterior para ver cómo funciona esto y cómo manejarlo de manera segura.

  1. Abre el archivo StringComparison.java en el editor WebIDE.

  2. Modifica el método main para incluir una cadena null:

    public class StringComparison {
        public static void main(String[] args) {
            String str1 = "hello";
            String str2 = "hello";
            String str3 = new String("hello");
            String str4 = null; // This string is null
    
            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));
    
            // Let's try comparing with the null string
            // System.out.println("Comparing str1 and str4 using equals(): " + str1.equals(str4)); // This line would cause a NullPointerException
            // System.out.println("Comparing str4 and str1 using equals(): " + str4.equals(str1)); // This line would also cause a NullPointerException
    
            // Correct way to compare when one string might be 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));
        }
    }

    En el código modificado:

    • Agregamos una cadena null llamada str4.
    • Comentamos las líneas que causarían una NullPointerException si se ejecutaran.
    • Agregamos ejemplos de cómo comparar cadenas de manera segura cuando una de ellas puede ser null. La forma más segura es comprobar si la cadena en la que se llama al método equals() no es null antes de llamar al método. Un patrón común es (stringVariable != null && stringVariable.equals(anotherString)). Alternativamente, se puede llamar a equals() en la cadena conocida que no es null si es posible, como "hello".equals(str4).
  3. Guarda el archivo (Ctrl+S o Cmd+S).

  4. Compila el programa modificado en la Terminal:

    javac StringComparison.java
  5. Ejecuta el programa compilado:

    java StringComparison

    Deberías ver una salida similar 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

    La salida muestra que las comparaciones seguras manejan correctamente la cadena null sin causar un error. La comparación entre str1 y str4 (que es null) se evalúa correctamente como false.

Este paso destaca la importancia de manejar valores null cuando se trabaja con objetos en Java, especialmente cadenas, para prevenir errores de NullPointerException.

Usar equalsIgnoreCase() para comparaciones sin distinción de mayúsculas y minúsculas

En este último paso, aprenderemos sobre el método equalsIgnoreCase(), que se utiliza para comparar cadenas sin tener en cuenta la capitalización de los caracteres. Esto es muy útil cuando se desea comprobar si dos cadenas son iguales, independientemente de si las letras están en mayúsculas o minúsculas.

El método equals() que utilizamos en los pasos anteriores realiza una comparación sensible a mayúsculas y minúsculas. Esto significa que "hello" no es igual a "Hello" cuando se utiliza equals(). El método equalsIgnoreCase() ignora la capitalización, por lo que "hello" y "Hello" se consideran iguales.

Modifiquemos nuestro programa una última vez para demostrar equalsIgnoreCase().

  1. Abre el archivo StringComparison.java en el editor WebIDE.

  2. Agrega algunas nuevas variables de cadena con diferentes capitalizaciones y utiliza equalsIgnoreCase() para compararlas:

    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"; // Different casing
            String str6 = "HELLO"; // All uppercase
    
            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));
    
            // Safe comparison with 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--- Case-Insensitive Comparisons ---");
            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() also handles null safely if called on a non-null string
            System.out.println("Comparing str1 and str4 using equalsIgnoreCase(): " + str1.equalsIgnoreCase(str4));
            // System.out.println("Comparing str4 and str1 using equalsIgnoreCase(): " + str4.equalsIgnoreCase(str1)); // This would still cause a NullPointerException
        }
    }

    En el código actualizado:

    • Agregamos str5 y str6 con diferentes capitalizaciones.
    • Agregamos nuevas declaraciones de impresión para demostrar la diferencia entre equals() y equalsIgnoreCase().
    • También mostramos que llamar a equalsIgnoreCase() en una cadena no nula con un argumento null no causa un error, similar a equals(). Sin embargo, llamar a equalsIgnoreCase() en una variable de cadena null aún resultará en una NullPointerException.
  3. Guarda el archivo (Ctrl+S o Cmd+S).

  4. Compila el programa en la Terminal:

    javac StringComparison.java
  5. Ejecuta el programa compilado:

    java StringComparison

    Deberías ver una salida similar 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
    
    --- Case-Insensitive Comparisons ---
    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

    La salida muestra claramente que equalsIgnoreCase() devuelve true cuando se comparan cadenas con los mismos caracteres pero diferentes capitalizaciones, mientras que equals() devuelve false.

Ahora has aprendido cómo comparar cadenas en Java utilizando equals() para comparaciones sensibles a mayúsculas y minúsculas, cómo manejar cadenas null de manera segura y cómo utilizar equalsIgnoreCase() para comparaciones sin distinción de mayúsculas y minúsculas. Estas son habilidades esenciales para trabajar con cadenas en Java.

Resumen

En este laboratorio, aprendimos cómo comparar cadenas en Java. Comenzamos entendiendo la diferencia entre comparar objetos de cadena utilizando el operador == y comparar su contenido utilizando el método equals(). Vimos que == comprueba la identidad del objeto, mientras que equals() comprueba la igualdad de la secuencia de caracteres.

Luego exploramos cómo manejar el potencial NullPointerException al comparar cadenas asegurándonos de que la cadena en la que se llama a equals() no sea nula. Finalmente, aprendimos cómo realizar comparaciones de cadenas sin distinción de mayúsculas y minúsculas utilizando el método equalsIgnoreCase().