En anteriores artículos he dado algunos ejemplos prácticos sobre una calculadora básica, calculadora de matriz y un formulario básico en Java, entre otros ejercicios. En estos ejemplos ha sido necesario aplicar algunas validaciones, entre estas, conocer si una cadena de texto esta vacía o no. Existen algunas maneras de comparar una cadena en Java de forma correcta.
El método length(), es la mejor manera de comprobar si la cadena está vacía o no. Este método simplemente devuelve el recuento de caracteres dentro de matriz de caracteres que constituye la cadena. Si el cuenta la longitud de la cadena, es decir, si el numero retornado es 0; se puede concluir con seguridad que la cadena está vacía.
1 2 3 4 5 6 7 8 9 | public boolean isEmpty(String str) { return str.equals(""); //Nunca hacer esto } public boolean isEmpty(String str) { return str.length()==0; //La forma correcta de comprobar si esta vacio } |
public boolean isEmpty(String str) { return str.equals(""); //Nunca hacer esto } public boolean isEmpty(String str) { return str.length()==0; //La forma correcta de comprobar si esta vacio }
Si quieres saber la razón del por que la primera forma es la incorrecta, te invito a seguir leyendo 😉
Vamos a ver el código fuente de los dos métodos dentro de la clase String.java.
Método length()
1 2 3 | public int length() { return count; } |
public int length() { return count; }
Método equals()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; } |
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
Análisis
Como se puede ver que el método length() es simplemente un método getter que devuelve el recuento de caracteres en forma de matriz. Así que prácticamente no desperdicia ciclos de CPU para calcular la longitud de la cadena. Y cualquier cadena con longitud 0 siempre va a ser una cadena vacía.
Mientras el método equals() toma un montón de declaraciones antes de concluir que la cadena está vacía. Hace verificación de referencia, encasillamiento si es necesario, crea matrices temporales y luego usa un ciclo while. Por lo tanto, toma una gran cantidad de ciclos de CPU para comprobar una simple condición.
A partir de la versión 6 de Java, la función isEmpty() está disponible en la propia clase String. También es recomendable hacer uso de esta función para implementar código con las mejores prácticas del lenguaje.