2014-12-17 13 views
6

Ho letto tante articolo come sulla differenza tra isEmpty() e size()> 0 per controllare che collection è vuota o non e ha scoperto che isEmpty() hanno perfomance sopra size() ma non riuscivo a capire facilmente perché perfomance di isEmpty() è buono anche se all'interno isEmpty () è solo la dimensione == 0?Comprensione della differenza tra Collection.isEmpty() e Collection.size() == 0?

mie domande sono:

  1. Può qualunque spiegare facilmente in quale scenario isEmpty() è più veloce e quando usare isEmpty() e size() funzione per controllare se è collectionempty o no?

  2. Qualcuno può spiegare questo, usando il codice o altro modo (diagrammi, grafici, ecc.) In modo che ogni principiante possa capire facilmente?

+1

Spero di aver controllato: http://stackoverflow.com/questions/11152536/check-if-a-collection-is-empty-in-java-which-is- the-best-method http://stackoverflow.com/questions/9341740/ifliststr-size-0-versus-ifliststr-isempty http: // stackoverflow.it/questions/1508975/why-is-list-size0-slow-than-list-isempty-in-java –

+0

Grazie a @Pam ma avevo già letto questo articolo ma non ottenendo la differenza esatta e il modo in cui ** O (1) e O (n) ** è calcolato in termini di prestazioni. –

+1

@KamleshKanazariya si potrebbe voler leggere sulla complessità http://stackoverflow.com/questions/3255/big-o-how-do-you-calculate-approximate-it – MihaiC

risposta

3

Fondamentalmente ho trovato che .size() può essere O (1) o O (N), a seconda del data structure; .isEmpty() non è mai O (N).

+1

AbstractCollection: 'public boolean isEmpty() { \t return size() == 0; } '. Il che significa che size() ed isEmpty() hanno la stessa complessità in tutte le principali collezioni – Eran

+1

hai appena copiato una risposta da qui http://stackoverflow.com/questions/9341740/ifliststr-size-0-versus-ifliststr-isempty, basta puntare l'OP a quella domanda ... – MihaiC

+0

@MihaiC Ho detto che l'avevo letto dallo stack overflow stesso, ma questo non significa che abbia la copia giusta. :) –

6

potrebbe essere che alcuni collezioni basta usare size()==0 all'interno del loro metodo isEmpty(), ma questo non significa che tutti fanno. L'implementazione predefinita di isEmpty() controlla solo se size() == 0, ma una raccolta specifica è libera di sovrascriverla con qualcos'altro se è più efficiente.

Ecco un bell'esempio. Il dice:

Attenzione, a differenza della maggior parte delle raccolte, il metodo di dimensione non è un'operazione a tempo costante.

Per questa classe, è consigliabile utilizzare isEmpty() anziché size() == 0.

(Per capire perché è vero per una skip list, avresti bisogno di leggere su come saltare liste di lavoro, ma non tornare e chiedere un'altra domanda su di loro, se volete sapere di più.)

+2

L'implementazione di dimensione() di LinkedList non attraversa l'elenco, ma tiene traccia delle dimensioni quando l'elenco viene modificato. – Martin

+0

@ Martin sì, ho appena aggiunto qualcosa a riguardo. Questo è il motivo per cui ho scritto "lista collegata" piuttosto che "LinkedList". L'implementazione standard tiene traccia delle dimensioni, ma questo non vuol dire che ogni raccolta * deve * fare questo. –

+0

@ Martin Ho cancellato l'esempio dell'elenco collegato e sostituito con un esempio chiaro e concreto. –

1

le ragioni principali per l'utilizzo di isEmpty piuttosto che dimensioni sarebbero:

it is more expressive (the code is easier to read and to maintain) 

it is faster, in some cases by orders of magnitude. 

spiegazione dettagliata here

++ stessa domanda ha chiesto here

+0

Grazie a @ ankur-singhal, sono d'accordo con la tua risposta, ma al momento mi sto concentrando sulla differenza ** sulle prestazioni ** piuttosto che sullo stile del codice o sulla manutenzione. –

+0

Per quanto riguarda le prestazioni, 'isEmpty()' può * consentire * un'implementazione per fare qualche ottimizzazione rispetto a 'size()'. Tuttavia, se e in che modo 'isEmpty()' è ottimizzato per le prestazioni è completamente fino alla classe di implementazione specifica utilizzata. Penso che l'unica cosa su cui possiamo fare affidamento sia 'O (isEmpty) <= O (size)'. Quindi, usando 'isEmpty' si ottiene un codice più espressivo ed è una specie di miglior sforzo sulle prestazioni. – JimmyB