Carlos Robles frikiblog

Despistados y principiantes: comparar Strings en Java.

| 0 comments

Estoy depurando el juego en android en el que estoy inmerso, y me he encontrado un comportamiento inesperado. He echado un vistazo rápido al código y rapidamente me he dado cuenta, y me ha entrado un sentimiento meláncolico: se me ha escapado un fallo de principiante.

El fallo en cuestion ha sido comparar dos strings con un ==, y os cuento formas de comparar cadenas:

  1. Comparar con ==
    En java, todo son objetos, y hay que pensar asi, pero siempre. 

    Por ejemplo algo como

    String micadena= new String ("texto");
    if (micadena == "texto")
    return true;
    return false;

    devolvera false, porque las dos cadenas no son el mismo objeto, y con == es lo unico que miramos.

    curiosamente algo como

    String micadena= "texto";
    String micadena2= "texto";
    if (micadena ==  micadena2)
    return true;
    return false;

    devolverá true, porque como no hemos usado ningun new, el compilador cuando va a crear las variables, internamente hace uno, y como ve que son iguales, guarda las dos en el mismo objeto, por lo que (y sin profundizar mas en cosas futuribles) las dos cadenas son la misma.

  2. Comparar con equals()
    Esta es la primera cosa en la que hay que pensarPara comparar realmente las cadenas y no si son o no la misma instancia, se usa el método equals(). 

    String micadena = new String("texto");
    String micadena2 = new String("texto");
    if (micadena.equals(micadena2))
    return true;

    que devuelve true. Esto es lo que tenemos que usar por norma general para comparar Strings.

    La gracia, ademas, es que podemos hacerlo directamente sombre un literal, sin tener que crear un objeto.

    if ("texto".equals(micadena)) 

    Que va genial cuando no sabemos si micadena puede ser null, asi nos evitamos comprobarlo (esto no es php, si la cadena es null la vamos a liar)

  3. Comparar con compareTo()
    Esto nos dice ademas, que cadena va antes. No usa orden alfabético directamente, sino el orden en la tabla de caracteres. Va bien pero depende para qué. A mi me pone nervioso cuando en algunos sitios te encuentras algo supuestamente ordenado alfabeticamente, pero te encuentras a Óscar antes que Angel.

    El equivalente a equals() seria

    if(micadena.compareTo(micadena2)==0)

    No voy a contar mas sobre este metodo, es util para muchas cosas, os invito a leer la referencia.

  4. Comparar con Collator Más estricto y más complicado. Nos permite crear un orden alfabetico humano. Podemos configurar distintos comportamientos mediante estas constantes:
    • Collator.PRIMARY: Dos letras son la misma si la base es la misma. A=a=á=Á
    • Collator.SECUNDARY Iguales mayúsculas y minúsculas, pero distintas si tienen acento.
    • Collator.TERCIARY mayusculas, minisculas, y con acento, todas distintas
    • Collator.IDENTICALLY esto es una paranoia. Solo son iguales si tienen el mismo código interno. Es decir, si hay distintas formas de codificar á, dos á que se consideren distintas podrian verse exactamente igual.

    Tampoco cuento más, hay referencias muy completas por ahi.

Y esto ha sido una buena forma de cogerme 5 minutos de descanso.

Leave a Reply

Required fields are marked *.

*