2010-07-13 14 views
9

Ho dato un'occhiata ad un codice GWT scritto da varie persone e ci sono diversi modi per confrontare le stringhe. Sono curioso di sapere se questa è solo una scelta di stile, o se uno è più ottimizzato rispetto ad un altro:Confronto stringa Java: scelta di stile o ottimizzazione?

"".equals(myString); 

myString.equals(""); 

myString.isEmpty(); 

C'è una differenza?

+0

Stai chiedendo solo di confrontare * stringhe * vuote con riferimenti alle stringhe o stringhe letterali e riferimenti alle stringhe in generale? – seh

risposta

14
"".equals(myString); 

non lancerà una NullPointerException se myString è nullo. Questo è il motivo per cui molti sviluppatori usano questo modulo.

myString.isEmpty(); 

è il modo migliore se myString non è mai nullo, perché spiega cosa sta succedendo. Il compilatore può ottimizzare questo o myString.equals(""), quindi è più una scelta di stile. isEmpty() mostra il tuo intento migliore di equals(""), quindi è generalmente preferito.

+2

Hai ragione su "" .equals (myString), ovviamente, ma trovo che questa sintassi intenzionalmente arretrata ferisca i miei occhi. Penso che se il tuo codice viene eseguito in una situazione in cui non puoi essere sicuro che un valore di stringa non sia nullo, è probabile che si verifichi un problema logico sottostante. –

+2

@Carl Trovo che le doppie virgolette al di fuori della parentesi abbiano un aspetto migliore. Ma assolutamente dire NPE a null prima e spesso. –

+0

isEmpty() è molto più efficiente poiché verifica solo la lunghezza della stringa rispetto a 0, mentre equals implica il casting, il confronto dei codici hash e così via. Vedere http://www.docjar.com/docs/api/java/lang/String.html – helpermethod

-3

Entrambe le opzioni che utilizzano "" potrebbero richiedere la creazione di un oggetto String temporaneo ma la funzione .isEmpty() non dovrebbe.

Se si sono presi la briga di inserire la funzione .isEmpty(), dico che è probabilmente meglio usarlo!

+4

Sarei molto sorpreso se la costante di stringa vuota non fosse già parte del pool interno di JRE poco dopo l'avvio. E una volta che una costante di questo tipo viene utilizzata ovunque all'interno di un classloader, rimane disponibile fino alla chiusura della JVM, quindi non sarei troppo preoccupato per un risultato di prestazioni. –

+0

isEmpty() è stato aggiunto come metodo di convenienza. Prima di ciò, dovevi controllare la lunghezza della stringa su null in questo modo: if (s.length() == 0). – helpermethod

2

apache StringUtils fornisce alcuni metodi di convenienza per la manipolazione delle stringhe.

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

check-out che metodo e quelli associati.

+0

È 'isEmpty' non abbastanza per te? –

+0

perché votarmi brah? Voglio dire, il vantaggio di StringUtils è che si aggiunge coerenza al proprio codice in modo da non avere "" .equals (blah) vs blah.equals (""). – hvgotcodes

+1

@Tom Beh, i metodi 'StringUtils' sono nulli. –

5

Attenzione che isEmpty() è stato aggiunto in Java 6 e, sfortunatamente, ci sono ancora persone che si lamentano abbastanza forte se non supportano Java 1.4.

+0

molto buono a sapersi. – KevMo

0

myString.isEmpty() è probabilmente la soluzione migliore se si sta lavorando su una versione recente di Java (1.6). È probabile che abbia prestazioni migliori di myString.equals ("") poiché deve solo esaminare una stringa.

"" .equals (myString) ha la proprietà di non generare un'eccezione di puntatore nullo se myString è null. Tuttavia, solo per questo motivo, lo eviterei, poiché di solito è meglio fallire velocemente se si verifica una condizione imprevista. Altrimenti qualche piccolo bug in futuro sarà molto difficile da rintracciare .....

myString.equals ("") è l'approccio più naturale/idiomatico per le persone che vogliono mantenere la compatibilità con le vecchie versioni di Java, o chi voglio solo essere molto esplicito su ciò a cui stanno comparando.