Java Player - ¿Como comparar cadenas? - ¿Como comparar dos String? - Diferencias entre equals() y == - ¿Como usar el compareTo()? - ¿Como usar el compareToIgnoreCase?

Bueno hace unas horas un compañero me hizo esta pregunta, generalmente doy por asentado que todo el mundo sabe las diferencias pero debido a que hay diferentes maneras voy aclararlas para todos los lectores.

Comparar Cadenas con ==

En java es muy común que se utilice el == comparar cadenas, pero el  == compara instancias, no cadenas.

Al hacer una comparación como la siguiente dará verdadero.

Diferencias entre equals() y  ==

Pero al hacer:
Diferencias entre equals() y  ==


El resultado es que las cadenas son desiguales.
Explicación:

Al hacer String cadena1 = "Prueba", el compilador ya conserva en memoria "Prueba" y al setearle a cadena2 = "Prueba", el compilador utiliza la misma instancia.

Pero en el caso de abajo que hacemos String cadena1 = new String("Prueba") y  String cadena2 = new String("Prueba") , el gran y santo NEW hace una nueva instancia del string "Prueba", por lo cual son instancias diferentes.


Comparar con .equals()

El método equals() lo poseen todos las clases ya que se heredan de la clase base Object, sirve especialmente para comprar una cadena de un objecto especifico, devolviendo un dato booleano.

Javadoc  Oficial de  J2SE

    /**
     * Compares this string to the specified object.  The result is {@code
     * true} if and only if the argument is not {@code null} and is a {@code
     * String} object that represents the same sequence of characters as this
     * object.
     *
     * @param  anObject
     *         The object to compare this {@code String} against
     *
     * @return  {@code true} if the given object represents a {@code String}
     *          equivalent to this string, {@code false} otherwise
     *
     * @see  #compareTo(String)
     * @see  #equalsIgnoreCase(String)
     */

El método equals() permite comparar cadenas.

.equals()

El método equals() permite comparar cadenas literales.

.equals()

Tengamos en cuenta que si hacemos esto: 


La cadena2 puede llegar a ser nula lo que provocaría un nullpointer excepción.


Comparar con el .equalsIgnoreCase()

Funciona igual que el equals(), pero ignora las mayúsculas.

.equalsIgnoreCase()


Comparar con el .compareTo()

Este método sirve para comparar dos cadenas, devolviendo 0, positivo o negativo.

Javadoc
    /**
     * Compares two strings lexicographically.
     * The comparison is based on the Unicode value of each character in
     * the strings. The character sequence represented by this
     * <code>String</code> object is compared lexicographically to the
     * character sequence represented by the argument string. The result is
     * a negative integer if this <code>String</code> object
     * lexicographically precedes the argument string. The result is a
     * positive integer if this <code>String</code> object lexicographically
     * follows the argument string. The result is zero if the strings
     * are equal; <code>compareTo</code> returns <code>0</code> exactly when
     * the {@link #equals(Object)} method would return <code>true</code>.
     * <p>
     * This is the definition of lexicographic ordering. If two strings are
     * different, then either they have different characters at some index
     * that is a valid index for both strings, or their lengths are different,
     * or both. If they have different characters at one or more index
     * positions, let <i>k</i> be the smallest such index; then the string
     * whose character at position <i>k</i> has the smaller value, as
     * determined by using the &lt; operator, lexicographically precedes the
     * other string. In this case, <code>compareTo</code> returns the
     * difference of the two character values at position <code>k</code> in
     * the two string -- that is, the value:
     * <blockquote><pre>
     * this.charAt(k)-anotherString.charAt(k)
     * </pre></blockquote>
     * If there is no index position at which they differ, then the shorter
     * string lexicographically precedes the longer string. In this case,
     * <code>compareTo</code> returns the difference of the lengths of the
     * strings -- that is, the value:
     * <blockquote><pre>
     * this.length()-anotherString.length()
     * </pre></blockquote>
     *
     * @param   anotherString   the <code>String</code> to be compared.
     * @return  the value <code>0</code> if the argument string is equal to
     *          this string; a value less than <code>0</code> if this string
     *          is lexicographically less than the string argument; and a
     *          value greater than <code>0</code> if this string is
     *          lexicographically greater than the string argument.
     */

Devuelve cero (0) cuando las dos cadenas son iguales.
.compareTo()
Devuelve positivo si la cadena pasada por parámetro se ordena antes.
Devuelve negativo si la cadena pasada por parámetro se ordena después.

Hay que tener en cuenta que el compareTo() compra según estén ordenados los caracteres en la tabla de caracteres que usemos ya que una  A mayúscula va antes que una minúscula y esta va antes que una á (a con acento).

La cadena2 puede llegar a ser nula lo que provocaría un nullpointer excepción.


Comparar con compareToIgnoreCase().


Este método sirve para comparar dos cadenas, devolviendo 0, positivo o negativo.
Funciona casi igual que el compareTo() pero se diferencia que ignora las mayúsculas y minúsculas.

Bueno gente espero que les allá resultado útil cualquier cosa me avisan.
Java Player - ¿Como comparar cadenas? - ¿Como comparar dos String? - Diferencias entre equals() y == - ¿Como usar el compareTo()? - ¿Como usar el compareToIgnoreCase? Java Player - ¿Como comparar cadenas? - ¿Como comparar dos String? - Diferencias entre equals() y  == - ¿Como usar el compareTo()? - ¿Como usar el compareToIgnoreCase? Reviewed by El lado oscuro de java on noviembre 13, 2013 Rating: 5

13 comentarios:

  1. hola soy novato en esto de java y estoy haciendo un programa donde compare dos numero leidos por el teclado
    este es mi codigo, en la comparacion == no me marca error pero cuando le quiero poner otra condicion donde a sea mayor que b me marca error
    me podrias ayudar te lo agradeceria mucho, gracias.

    public static void main(String[] args) {
    int numero;
    String a = "";
    a = JOptionPane.showInputDialog("dame un numero");

    String b = "";
    b = JOptionPane.showInputDialog("dame un numero");
    numero = Integer.parseInt(a);
    numero = Integer.parseInt(b);
    if (a.equals(b)) {
    JOptionPane.showMessageDialog(null, "Los numeros son iguales");
    } else {

    if (a < b) {
    JOptionPane.showMessageDialog(null, "Ela mayor es " + a);
    } else {
    JOptionPane.showMessageDialog(null, "El mayor es " + b);
    }
    }

    ResponderEliminar
    Respuestas
    1. Hola Yordy tenes 2 grandes problemas, 1 a numero le estas asignando primero el valor del primer input y luego se lo volves asignar. deberías tener 2 variables una para cada input, el segundo es que validas el JOptionPanel, deberias valider el contenido del input es decir las vairables numero y numeroDos.

      Y como ayuda te diria que uses Integer en ves de int. así podes tener el equals.
      Cualquier cosa pregúntame no molestas! Saludos!

      Eliminar
    2. hola de nuevo yo!
      el equals si me lo da, y ya declare dos variables diferentes para cada input, pero al realizar la condicion
      if (a < b) {
      JOptionPane.showMessageDialog(null, "El mayor es " + a);
      }
      me marca error a pesar de que ya utilice
      numero = Integer.parseInt(a);
      numero1 = Integer.parseInt(b);
      para comvertirlos a enteros
      saludos y gracias por la ayuda!!

      Eliminar
    3. Este comentario ha sido eliminado por el autor.

      Eliminar
  2. Buenas tardes, soy nuevo en java y mi problema es que en el siguiente codigo no se que falla. Lo que pretende este problema es que cuando se introduce por pantalla un string "hola" le muestre al usuario "que tal"; pero si no introduce "hola" que le muestre "adiós". Si me ayudaría me haría un gran favor. Gracias y un saludo.
    Posdata: Adjunto mi código


    public static void main(String[] args) {
    String hola = new String ("hola");
    System.out.println();
    String entradaTeclado = "";
    //creación del objeto scanner
    Scanner entradaEscaner = new Scanner(System.in);
    //Invocamos un método sobre un objeto Scanner
    entradaTeclado = entradaEscaner.nextLine();
    if(entradaTeclado.equals(hola)) {
    System.out.println("que tal");}
    else System.out.println("adios");


    }

    ResponderEliminar
    Respuestas
    1. acabo de probar tu código y funciona correctamente, acordate que tenes que tipear en la consola.

      saludos!

      Eliminar
    2. Hola...
      Creo que falta

      import java.util.Scanner;
      class NombreArchivo {

      Eliminar
  3. Hola, buenos días, soy nueva en java. te hago una consulta: si tengo una clase
    public class Book(){
    .....

    }

    y tengo:
    Book book1 = new Book();
    Book book2 = new Book();
    entonces si hago book1.equals(book2) esto da falso, ok, esto es correcto porque book1 y book2 son 2 instancias distintas, salvo que redefina el equals y use un criterio de igualdad para esos objetos.
    Pero que pasa con:
    String cadena1 = new String("hola");
    String cadena2 = new String("hola");
    cuando hago cadena1.equal(cadena2) esto da true, por que da true ?, si son 2 objetos distintos (instancias distintas).
    Por favor me podrias explicar a que se debe esto?. que hace el compilador en este caso ?
    Se me ocurre que el compilador quizas cuando hace String cadena1 = new String("hola") reserva una parte de la memoria con ese objeto y luego
    cuando hace String cadena2 = new String("hola") , se da cuenta que es el mismo y utiliza ese mismo espacio de memoria, pero porque ?
    si esos 2 objetos son instancias distintas. No entiendo.
    Muchas gracias

    Slds

    ResponderEliminar
    Respuestas
    1. Hola, estaba viendo que que tanto para cadena1 y cadena2 el hashcode es el mismo, en este caso 0.
      string1.hashCode();
      string2.hashCode();
      Ambos hascode son iguales, pero por qué?, si son 2 instancias distintas.
      Sigo sin entender.

      Mucha gracias.

      Eliminar
    2. Gabriela disculpa la demora estoy a full con trabajo, te paso a explicar, cuando vos haces las validaciones con .equals como esta descrito arriba valida del contenido del String mientras que cuando validas con == validas instancias.

      Saludos

      Eliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar

Con la tecnología de Blogger.