2010-07-13 16 views
9

Çeşitli kişiler tarafından yazılmış bazı GWT kodlarına bakıyorum ve dizeleri karşılaştırmanın farklı yolları var. Bu sadece bir stil seçimi ise merak ediyorum, ya biri varsa daha diğerinden daha iyi duruma getirilmiştir:Java Dize Karşılaştırması: stil seçimi veya optimizasyonu?

"".equals(myString); 

myString.equals(""); 

myString.isEmpty(); 

bir fark var mı?

+0

sadece genel dize referansları veya dize hazır ve dize referanslar karşı * boş * dizeleri karşılaştırma hakkında soruyorsun? – seh

cevap

14
"".equals(myString); 

bir NullPointerException eğer myString boş atmaz. Bu yüzden birçok geliştirici bu formu kullanıyor. o ne olup bittiğini açıklar çünkü myString, asla null ise

myString.isEmpty(); 

en iyi yoldur. Derleyici bunu veya myString.equals("")'u optimize edebilir, bu yüzden daha fazla stil seçimidir. isEmpty(), amacınızı equals("")'dan daha iyi gösterir, bu yüzden genellikle tercih edilir. Geçici String nesnesi oluşturulmasını gerektirebilir "" kullanarak seçenekler ama .isEmpty() fonksiyonu olmamalı ait

+2

Elbette "" .equals (myString) hakkında haklısınız, ama bu kasıtlı olarak geriye dönük sözdizimin gözlerimi acıttığını görüyorum. Kodunuzun bir String değerinin boş olup olmadığından emin olamayacağınız bir duruma düştüğünü düşünürsek, şansın altta yatan bir mantık sorununun var olduğunu düşünüyorum. –

+2

@Carl Parantez dışındaki çift tırnakların daha iyi olduğunu görüyorum. Ancak kesinlikle NPE'nin erken ve sık sık sıfır olduğunu söyleyin. –

+0

isEmpty() çok daha verimlidir, çünkü sadece dize uzunluğunu 0'a karşı test eder, oysa eşittir, döküm kodlarını karşılaştırır ve benzerleri içerir. Bkz. Http://www.docjar.com/docs/api/java/lang/String.html – helpermethod

-3

de. onlar bunu kullanmak için muhtemelen en iyi olduğunu söylemek de) işlevini .isEmpty (koymak için rahatsız ederse

!

+4

Boş dize sabiti, JRE'nin stajyer havuzunun başlangıcından kısa bir süre önce herhangi bir parçasının parçası değilse çok şaşırırım. Böyle bir sabit bir sınıf yükleyicinin herhangi bir yerinde kullanıldığında, JVM çıkana kadar kullanılabilir kalır, bu yüzden bir performans isabeti konusunda fazla endişelenmezdim. –

+0

isEmpty() bir kolaylık yöntemi olarak eklenmiştir. Bundan önce, String uzunluğunu null değerine karşı şu şekilde kontrol etmelisiniz: if (s.length() == 0). – helpermethod

2

apache'nin StringUtils, iyi String manipülasyonu için bir kolaylık yöntemler sağlar.

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

bu yöntem ve ilgili olanlar üzerinden onay.

+0

'isEmpty' sizin için yeterli değil mi? –

+0

neden beni brah'a oy veriyor? Demek istediğim, StringUtils'in avantajı, kodunuza tutarlılık kazandırmaktır, böylece "" .bunlar (blah) vs blah.equals (""). – hvgotcodes

+1

@Tom Well, 'StringUtils' yöntemleri geçersizdir. –

5

Java 6'da isEmpty() eklendiğine dikkat edin ve maalesef Java'yı desteklemiyorsanız hala yüksek sesle şikayet eden kişiler var. Eğer Java son sürümü (1.6) üzerinde çalışıyorsanız

+0

bilmek çok iyi. – KevMo

0

myString.isEmpty() muhtemelen en iyisidir. Sadece bir dizeyi incelemek gerektiğinden, myString.equals ("") 'dan daha iyi performans göstermesi olasıdır. ".equals (myString)

" myString boşsa bir boş gösterici durum atma değil özelliğine sahiptir. Ancak, bu nedenle, beklenmedik bir duruma düştüğünüzde, hızlı bir şekilde başarısız olmanız genellikle daha iyi olduğu için, bundan kaçınmak isterim. Aksi taktirde gelecekte küçük bir hata göreceksiniz.

myString.equals (""), eski Java sürümleriyle uyumluluğu korumak isteyen kişiler için en doğal/deyimsel yaklaşımdır. sadece karşılaştırdıkları şey hakkında çok açık olmak isterler.