numeros - comparar una cadena java
Compare dos cadenas en Java con posibles valores nulos (10)
Desde Java 7 puede usar el método estático Objects.equals(Object, Object)
para realizar comprobaciones equivalentes en dos objetos sin importar que sean null
.
Si ambos objetos son null
, devolverá true
, si uno es null
y otro no lo es, devolverá false
. De lo contrario, devolverá el resultado de llamar a equals
en el primer objeto con el segundo como argumento.
Quiero comparar dos cadenas para la igualdad en Java, cuando una o ambas podrían ser null
, así que no puedo simplemente llamar a .equals()
. ¿Cuál es la mejor manera?
boolean compare(String str1, String str2) {
...
}
Editar:
return ((str1 == str2) || (str1 != null && str1.equals(str2)));
Desde la versión 3.5, Apache Commons StringUtils tiene los siguientes métodos:
static int compare(String str1, String str2)
static int compare(String str1, String str2, boolean nullIsLess)
static int compareIgnoreCase(String str1, String str2)
static int compareIgnoreCase(String str1, String str2, boolean nullIsLess)
Estos proporcionan una comparación nula de cadenas seguras.
Esto es lo que usa el código interno de Java (en otros métodos de compare
):
public static boolean compare(String str1, String str2) {
return (str1 == null ? str2 == null : str1.equals(str2));
}
OK, entonces, ¿qué significa la "mejor solución posible"?
Si quiere decir más legible, entonces todas las soluciones posibles son prácticamente equivalentes para un programador experimentado de Java. Pero la OMI más legible es esta
public boolean compareStringsOrNulls(String str1, String str2) {
// Implement it how you like
}
En otras palabras, oculte la implementación dentro de un método simple que (idealmente) puede estar en línea.
(También podría "extraer de la fuente" a una biblioteca de utilidad de terceros ... si ya lo usa en su base de código).
Si te refieres al más eficiente, entonces:
- la solución más eficiente depende de la plataforma y el contexto,
- uno de los problemas de "contexto" es la frecuencia relativa (dinámica) de ocurrencia de argumentos
null
, - probablemente no importe qué versión es más rápida ... porque la diferencia es probablemente demasiado pequeña como para hacer una diferencia en el rendimiento general de la aplicación, y
- Si lo hace, la única forma de averiguar cuál es el más rápido EN SU PLATAFORMA es probar ambas versiones y medir la diferencia.
Para aquellos en Android, que no pueden usar Object.equals de API 19 (str1, str2), existe esto:
android.text.TextUtils.equals(str1, str2);
No es seguro. Rara vez tiene que usar el método más caro string.equals () porque las cadenas idénticas en Android casi siempre se comparan con el operando "==" gracias a la agrupación de cadenas de Android , y las comprobaciones de longitud son una forma rápida de filtrar la mayoría de las discrepancias.
Código fuente:
/**
* Returns true if a and b are equal, including if they are both null.
* <p><i>Note: In platform versions 1.1 and earlier, this method only worked well if
* both the arguments were instances of String.</i></p>
* @param a first CharSequence to check
* @param b second CharSequence to check
* @return true if a and b are equal
*/
public static boolean equals(CharSequence a, CharSequence b) {
if (a == b) return true;
int length;
if (a != null && b != null && (length = a.length()) == b.length()) {
if (a instanceof String && b instanceof String) {
return a.equals(b);
} else {
for (int i = 0; i < length; i++) {
if (a.charAt(i) != b.charAt(i)) return false;
}
return true;
}
}
return false;
}
Para estos casos, sería mejor usar Apache Commons StringUtils#equals , ya maneja cadenas nulas. Muestra de código:
public boolean compare(String s1, String s2) {
return StringUtils.equals(s1, s2);
}
Si no desea agregar la biblioteca, solo copie el código fuente del método StringUtils#equals
y aplíquelo cuando lo necesite.
Puede usar java.util.Objects
siguiente manera.
public static boolean compare(String str1, String str2) {
return Objects.equals(str1, str2);
}
boolean compare(String str1, String str2) {
if (str1 == null || str2 == null)
return str1 == str2;
return str1.equals(str2);
}
boolean compare(String str1, String str2) {
if(str1==null || str2==null) {
//return false; if you assume null not equal to null
return str1==str2;
}
return str1.equals(str2);
}
es esto lo que deseas?
boolean compare(String str1, String str2) {
return (str1==null || str2==null) ? str1 == str2 : str1.equals(str2);
}