Quiero comparar dos cadenas para la igualdad en Java, cuando uno o ambos podrían ser null
, por lo que no puedo simplemente llamar .equals()
. ¿Cuál es la mejor manera?
boolean compare(String str1, String str2) {
...
}
Editar:
return ((str1 == str2) || (str1 != null && str1.equals(str2)));
Respuestas:
Esto es lo que usa el código interno de Java (en otros
compare
métodos):fuente
<0
,==0
o>0
para indicar cuál es menor / rallador que el otroObjects.equals(Object, Object)
como Mark Rotteveel ha señalado en su respuesta (favor de votar)Desde Java 7, puede usar el método estático
java.util.Objects.equals(Object, Object)
para realizar verificaciones iguales en dos objetos sin preocuparse por ellosnull
.Si ambos objetos son
null
, volverátrue
, si uno esnull
y otro no, volveráfalse
. De lo contrario, devolverá el resultado de invocarequals
el primer objeto con el segundo como argumento.fuente
Object.equals(Object)
no hay verificación de tipo de tiempo de compilación. ElObjects.equals(Object, Object)
funcionamiento es muy lo mismo que una normal,equals
y vuelva a la inferencia / controles por IDE, esas reglas heurísticas que son también son compatibles paraObjects.equals(Object, Object)
(por ejemplo, IntelliJ IDEA 2.016,2 tiene el mismo cheque, tanto para los iguales normales y la de los objetos).Para estos casos, sería mejor usar Apache Commons StringUtils # igual , ya maneja cadenas nulas. Código de muestra:
Si no desea agregar la biblioteca, simplemente copie el código fuente del
StringUtils#equals
método y aplíquelo cuando lo necesite.fuente
Para aquellos en Android, que no pueden usar Object.equals (str1, str2) de API 19, existe esto:
Es nulo seguro. Raramente tiene que usar el método string.equals () más caro 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 los desajustes.
Código fuente:
fuente
Desde la versión 3.5 Apache Commons StringUtils tiene los siguientes métodos:
Estos proporcionan una comparación de cadenas segura nula.
fuente
Usando Java 8:
fuente
Compare dos cadenas usando el método equals (-, -) y equalsIgnoreCase (-, -) de la clase Apache Commons StringUtils.
StringUtils.equals (-, -) :
StringUtils.equalsIgnoreCase (-, -) :
fuente
Puedes usar
java.util.Objects
lo siguiente.fuente
¿Es esto lo que deseabas?
fuente
false
si ambas cadenas son lasnull
que podrían no ser el resultado deseado.fuente
fuente
Bien, entonces, ¿qué significa "la mejor solución posible"?
Si te refieres a lo más legible, entonces todas las soluciones posibles son prácticamente equivalentes para un programador Java experimentado. Pero en mi opinión, lo más legible es esto
En otras palabras, oculte la implementación dentro de un método simple que (idealmente) se pueda incorporar.
(También puede "externalizar" a una biblioteca de utilidades de terceros ... si ya la usa en su base de código).
Si te refieres al más eficiente, entonces:
null
argumentos,fuente