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

if(listStr.size == 0){ 

} 

controse (listStr.size == 0) {contro se (listStr.isEmpty()) {

if(listStr.isEmpty()){ 

} 

A mio avviso uno dei vantaggi di utilizzare listStr.isEmpty() è che non è così controlla la dimensione della lista e poi la confronta a zero, controlla solo se la lista è vuota. Ci sono altri vantaggi visto che spesso vedo if(listStr.size == 0) invece di if(listStr.isEmpty()) in codebase? C'è una ragione per cui viene controllata in questo modo di cui non sono a conoscenza?

+3

In 1.6, 'ArrayList.isEmpty' è implementato come' return return size == 0; '. – khachik

risposta

26

Le risposte a this question potrebbero darti la risposta. Fondamentalmente, nelle implementazioni di alcune liste il metodo isEmpty() verifica se la dimensione è zero (e quindi dal punto di vista delle prestazioni sono praticamente equivalenti). In altri tipi di elenchi (ad esempio gli elenchi collegati), tuttavia, il conteggio degli oggetti richiede più tempo che controllare se è vuoto o meno.

Per questo motivo è sempre conveniente utilizzare il metodo isEmpty() per verificare se un elenco è vuoto. I motivi per cui tale metodo viene fornito in tutti i tipi di elenchi sono anche correlati all'interfaccia, poiché ArrayList, Vector e LinkedList implementano la stessa interfaccia List: this interface ha il metodo isEmpty(); quindi, ogni specifico tipo di elenco fornisce la sua implementazione del metodo isEmpty().

+2

Risposta piacevole, un solo commento: L'implementazione di dimensione() di LinkedList non attraversa la lista, ma tiene traccia delle dimensioni man mano che nuovi elementi vengono aggiunti o rimossi. Pertanto, le prestazioni di LinkedLists di size() rispetto a isEmpty() (che ereditano da AbstractCollection) non differiscono affatto. Detto questo, sono d'accordo sul fatto che potrebbero esserci strutture di dati che hanno implementazioni più lente di size() rispetto a isEmpty() ma una ragionevole implementazione non lo farebbe. Inoltre, credo che potresti anche citare il principio DRY qui come controllo se size() == 0 è già fatto per te nella maggior parte dei metodi isEmpty(). –

11

No, non c'è motivo. isEmpty() esprime l'intento in modo più chiaro e dovrebbe essere preferito. PMD ha anche a rule per quello. Non importa molto, però.

+0

Esattamente. Inoltre, cercalo nella javadoc. Alcune implementazioni chiamano size() comunque da isEmpty(). – YRH

6

.size() può essere O (1) o O (N), a seconda della struttura dati; .isEmpty() non è mai O (N).

+1

Non vedo perché isEmpty sia sempre O (1) (ma sono d'accordo che isEmpty() dovrebbe essere sempre almeno veloce come size()). Potrebbe anche dipendere molto dalla struttura dei dati. Non sono a conoscenza di alcuna raccolta standard in cui la dimensione è O (n). Ce n'è uno? –

+1

Si prega di tentare di immaginarne uno. Qualsiasi struttura con una sentinella - una stringa C, una matrice di puntatori terminata da NULL, un elenco di celle terminate da zero. Tutti questi possono essere sottostanti a un tipo ibrido che memorizza nella cache la lunghezza, ma ciò non è gratuito. ConcurrentLinkedQueue –

Problemi correlati