2012-02-18 18 views
23
List<String> listStr = new ArrayList<String>(); 

if(listStr.size == 0){ 

} 

Benceif (listStr.size == 0) {öyle değil (listStr.isEmpty()) {

if(listStr.isEmpty()){ 

} 

karşı listStr.isEmpty() kullanmanın faydalarından biri ise o karşı listenin boyutunu kontrol edip sıfırıyla karşılaştırır, sadece listenin boş olup olmadığını kontrol eder. Sık sık if(listStr.isEmpty()) yerine if(listStr.size == 0) kodunu görüyorum, başka avantajlar var mı? Bu şekilde kontrol edilmememin bir nedeni var mı?

+3

1.6'da, "ArrayList.isEmpty", dönüş dönüş boyutu == 0; 'olarak uygulanır. – khachik

cevap

26

this question yanıtları size yanıt verebilir. Temel olarak, bazı listelerin uygulamalarında isEmpty() yöntemi, boyutun sıfır olup olmadığını kontrol eder (ve dolayısıyla performans açısından pratik olarak eşdeğerdir). Diğer liste türlerinde (örneğin, bağlantılı listeler), ancak sayım öğeleri, boş olup olmadığını kontrol etmekten daha fazla zaman gerektirir.

Bu nedenle, listenin boş olup olmadığını kontrol etmek için isEmpty() yöntemini kullanmak her zaman uygundur. Bu tür bir yöntemin her tür listeden sağlanma nedenleri, ara yüzle de ilgilidir, çünkü ArrayList, Vector ve LinkedList, aynı List arabirimini uygular: this interface, isEmpty() yöntemine sahiptir; Daha sonra, her bir özel liste, isEmpty() yönteminin uygulanmasını sağlar. Veri yapısına bağlı olarak O (1) veya O (N) olabilir,

+2

Güzel yanıt, sadece bir yorum: LinkedList'in size() boyutu uygulanıyor, listeyi geçmez, ancak yeni öğeler eklendiğinde veya kaldırıldığında boyutu izler. Bu nedenle, BağlantılıListelerin boyutu() 'nin isEmpty() (AbstractCollection öğesinden devraldıkları) karşısında performansı hiç değişmez. Bununla birlikte, boyutu() isEmpty() 'ye göre daha yavaş yürüten veri yapıları olabileceğine katılıyorum, ancak makul bir uygulama olmazdı. Ayrıca, buradaki KURU prensibini de kontrol edip edemeyeceğinizi düşünüyorum. size() == 0, isEmpty() yöntemlerinin çoğunda sizin için zaten yapıldı. –

11

Hayır, bunun bir nedeni yok. isEmpty(), niyetini daha açık bir şekilde ifade eder ve tercih edilmelidir. PMD bunun için a rule bile var. Gerçi, önemli değil.

+0

Tam olarak. Ayrıca, javadoc'a bakın. Bazı uygulamalar boyutu() isEmpty() yönteminden çağırır. – YRH

6

.size(); .isEmpty() asla O (N) değildir.

+1

Neden her zaman O (1) olur (2) (ancak, her zaman en az() boyutunda olduğu kadar kısa olmamalıdır. Veri yapısına da çok iyi bağlı olabilir. Boyutun O (n) olduğu herhangi bir standart koleksiyonun farkında değilim. Biri var mı –

+1

Lütfen bir hayal etmeyi deneyin. Bir sentinel ile herhangi bir yapı - bir C dizesi, NULL tarafından sonlandırılan bir dizi işaretçi, nil tarafından sonlandırılmış bir hücre listesi. Bunların tümü, uzunluğun önbelleğe alındığı bir hibrit türün altından kalkabilir, ancak bu ücretsiz değildir. ConcurrentLinkedQueue –