2010-07-13 6 views
9

He estado mirando un código GWT escrito por varias personas y hay diferentes formas de comparar cadenas. Estoy ansioso por ver si esto es sólo una opción de estilo, o si uno es más que otro optimizado:Comparación de cadenas Java: ¿elección de estilo u optimización?

"".equals(myString); 

myString.equals(""); 

myString.isEmpty(); 

¿Hay alguna diferencia?

+0

¿Estás preguntando acerca de comparar cadenas * vacías * con referencias de cadenas, o literales de cadenas y referencias de cadenas en general? – seh

Respuesta

14
"".equals(myString); 

no arrojará un NullPointerException si myString es nulo. Es por eso que muchos desarrolladores usan esta forma.

myString.isEmpty(); 

es la mejor manera si myString nunca es nula, porque explica lo que está pasando. El compilador puede optimizar esto o myString.equals(""), por lo que es más una opción de estilo. isEmpty() muestra su intención mejor que equals(""), por lo que generalmente se prefiere.

+2

Tiene razón acerca de "" .equals (myString), por supuesto, pero me parece que esta sintaxis intencionalmente retrógrada me duele los ojos. Creo que si su código se encuentra con una situación en la que no puede estar seguro de si un valor de String no es nulo, es probable que haya un problema de lógica subyacente que se resiste. –

+2

@Carl Me parece que las comillas dobles fuera del paréntesis se ven mejor. Pero absolutamente diga NPE a nulos temprano y con frecuencia. –

+0

isEmpty() es mucho más eficiente, ya que solo prueba la longitud de la cadena contra 0, mientras que equivale a lanzar, comparar códigos hash, etc. Ver http://www.docjar.com/docs/api/java/lang/String.html – helpermethod

-3

Ambas opciones que usan "" pueden requerir la creación de un objeto String temporal pero la función .isEmpty() no.

Si se molestaron en poner la función .isEmpty() en ¡Yo digo que probablemente sea mejor usarla!

+4

Me sorprendería mucho que la constante de cadenas vacías no formara parte del grupo interno de JRE poco después del inicio. Y una vez que tal constante se utiliza en cualquier lugar dentro de un cargador de clases, permanece disponible hasta que se cierre la JVM, por lo que no estaría demasiado preocupado por un golpe de rendimiento. –

+0

isEmpty() fue agregado como un método de conveniencia. Antes de eso, había tenido que verificar la longitud de cadena contra null de esta manera: if (s.length() == 0). – helpermethod

2

apache StringUtils proporciona algunos métodos de conveniencia para, bueno, la manipulación de cadenas.

http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html#isBlank(java.lang.CharSequence)

la salida de ese método y asociados queridos.

+0

¿'IsEmpty' no es suficiente para ti? –

+0

¿por qué me votaste brah? Quiero decir, la ventaja de StringUtils es que le agregas consistencia a tu código para que no tengas "" .equals (blah) vs blah.equals (""). – hvgotcodes

+1

@Tom Bueno, los métodos de 'StringUtils' son nulos. –

5

Tenga en cuenta que isEmpty() se agregó en Java 6 y, desafortunadamente, todavía hay personas que se quejan bastante fuerte si no son compatibles con Java 1.4.

+0

muy bueno saber. – KevMo

0

myString.isEmpty() es probablemente mejor si está trabajando en una versión reciente de Java (1.6). Es probable que funcione mejor que myString.equals ("") ya que solo necesita examinar una cadena.

"" .equals (myString) tiene la propiedad de no arrojar una excepción de puntero nulo si myString es nulo. Sin embargo, solo por esa razón lo evitaría, ya que generalmente es mejor fallar rápido si se produce una situación inesperada. De lo contrario, un pequeño error en el futuro será muy difícil de rastrear ...

myString.equals ("") es el enfoque más natural/idiomático para las personas que desean mantener la compatibilidad con las versiones anteriores de Java, o solo quiero ser muy explícito con respecto a lo que están comparando.

Cuestiones relacionadas