2010-07-13 5 views
9

Ich habe mir einen GWT-Code angesehen, der von verschiedenen Leuten geschrieben wurde, und es gibt verschiedene Möglichkeiten, Zeichenketten zu vergleichen. Ich bin gespannt, ob dies nur eine Art Wahl ist, oder, wenn man mehr als eine andere optimiert ist:Java String Vergleich: Stilwahl oder Optimierung?

"".equals(myString); 

myString.equals(""); 

myString.isEmpty(); 

Gibt es einen Unterschied?

+0

Fragen Sie nur über den Vergleich * leerer * Strings mit String-Referenzen oder String-Literalen und String-Referenzen im Allgemeinen? – seh

Antwort

14
"".equals(myString); 

wird kein NullPointerException wenn myString ist null werfen. Aus diesem Grund verwenden viele Entwickler dieses Formular.

myString.isEmpty(); 

ist der beste Weg, wenn myString nie null ist, weil es erklärt, was los ist. Der Compiler kann dies optimieren oder myString.equals(""), so dass es eher eine Stilwahl ist. isEmpty() zeigt Ihre Absicht besser als equals(""), so dass es im Allgemeinen bevorzugt wird.

+2

Sie haben natürlich Recht mit "" .equals (myString), aber ich finde, dass diese absichtlich rückwärts gerichtete Syntax meine Augen schmerzt. Ich denke, wenn Ihr Code in eine Situation gerät, in der Sie nicht sicher sein können, ob ein String-Wert nicht null ist, besteht die Gefahr, dass ein zugrunde liegendes Logikproblem überlagert wird. –

+2

@Carl Ich finde die Anführungszeichen außerhalb der Klammern besser aussehen. Aber sag NPE unbedingt früh und oft Null. –

+0

isEmpty() ist viel effizienter, da es nur die String-Länge gegen 0 testet, während equals Casting beinhaltet, Hash-Codes vergleicht und so weiter. Siehe http://www.docjar.com/docs/api/java/lang/String.html – helpermethod

-3

Beide Optionen, die "" verwenden, erfordern möglicherweise die Erstellung eines temporären String-Objekts, die Funktion .isEmpty() sollte dies jedoch nicht tun.

Wenn sie sich bemühen, die .isEmpty() -Funktion in ich sage, ist es wahrscheinlich am besten, es zu verwenden!

+4

Ich wäre sehr überrascht, wenn die leere String-Konstante nicht schon kurz nach dem Start Teil eines JRE-internen Pools wäre. Und sobald eine solche Konstante irgendwo innerhalb eines Klassenladers verwendet wird, bleibt sie verfügbar, bis die JVM beendet wird, so dass ich über einen Leistungseinbruch nicht allzu besorgt wäre. –

+0

isEmpty() wurde als eine bequeme Methode hinzugefügt. Vorher mussten Sie die String-Länge wie folgt auf null überprüfen: if (s.length() == 0). – helpermethod

2

Apache StringUtils bietet einige bequeme Methoden für Stringmanipulation.

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

überprüfen, die Verfahren und die damit verbunden diejenigen.

+0

Ist 'isEmpty' nicht genug für dich? –

+0

wieso hast du mich abgelehnt, brah? Ich meine, der Vorteil der StringUtils ist, dass Sie Ihrem Code Konsistenz hinzufügen, so dass Sie keine ".equals (blah) vs blah.equals (" ") haben. – hvgotcodes

+1

@Tom Nun, 'StringUtils' Methoden sind null sicher. –

5

Beachten Sie, dass isEmpty() in Java 6 hinzugefügt wurde, und leider gibt es immer noch Leute, die sich ziemlich laut beschwerten, wenn Sie Java 1.4 nicht unterstützen.

+0

sehr gut zu wissen. – KevMo

0

myString.isEmpty() ist wahrscheinlich am besten, wenn Sie an einer aktuellen Version von Java (1.6) arbeiten. Es ist wahrscheinlich besser als myString.equals (""), da es nur eine Zeichenfolge untersuchen muss.

"" .equals (myString) hat die Eigenschaft, keine Nullzeiger-Ausnahme auszulösen, wenn myString null ist. Aber nur aus diesem Grund würde ich es vermeiden, da es normalerweise besser ist, schnell zu versagen, wenn Sie eine unerwartete Bedingung treffen. Sonst wird ein kleiner Fehler in der Zukunft sehr schwer zu finden sein.

myString.equals ("") ist der natürlichste/idiomatische Ansatz für Leute, die Kompatibilität mit älteren Java-Versionen behalten wollen oder wer ich möchte nur sehr deutlich machen, mit was sie verglichen werden.