PDA

View Full Version : If e switch Java


Newbyte98
23-11-2014, 23:01
Salve a tutti, :)

vorrei porvi delle domande che riguardano il linguaggio Java, e più precisamente if (else) e switch:

- Quale dei due è più veloce?
- In che condizioni è meglio usare uno invece dell'altro?

Ad esempio:



if (a == 1)
{
// istruzioni
}
else // Che poi non so se è meglio creare if nidificati o in cascata in questo caso... secondo voi?
{
if (a == 2)
{
// istruzioni
}
}

// oppure

switch (a)
{
case 1:
// istruzioni
break;
case 2:
// istruzioni
break;
}


Quale conviene usare (non mi interessa la facilità di lettura, mi interessa l'efficienza)?

So anche che esiste in Java la possibilità di fare cose del genere (io vengo dal Pascal quindi capitemi se questa cosa che per me è eccezionale in realtà non lo è):



boolean c1 = true;
boolean c2 = true;
boolean c3 = false;

if(c1) {

// il blocco viene eseguito

} else if(c2) {

// il blocco non viene eseguito anche se 'c2' è 'true'

}


if(c3) {

// il blocco non viene eseguito perché 'c3' è 'false'

} else if(c2) {

// il blocco viene eseguito, poiché 'c2' è 'true' mentre 'c3' è 'false'
}



E' uguale allo switch? Come funzionamento intendo... me lo potreste spiegare?

Grazie MILLE a chi risponderà a tutte le mie domande :D e grazie comunque a chi mi aiuterà in maniera minore :)

ps: ma perché è stata creata questa distinzione, uno non bastava??? :wtf:

tagan
24-11-2014, 08:36
- Quale dei due è più veloce?
- In che condizioni è meglio usare uno invece dell'altro?

quale sia il più veloce non te lo so dire, aspettiamo qualcuno con più esperienza, ma credo che una volta compilato, il codice dello "switch" sia identico ad un "if" nidificato.
come logica, lo switch è uguale all'IF nidificato in quanto una volta entrato in un case, poi c'è il BREAK che esclude gli altri test!
l'IF nidificato, è migliore dei test in sequenza (se una condizione esclude l'altra):
esempio
se a=1
il codice

if (a==1) ..... //esegue il test, ma anche il blocco if
if (a==2)...... //esegue solo il test ma è inutile. fa una istruzione in più

nel nidificato no.



boolean c1 = true;
boolean c2 = true;
boolean c3 = false;

if(c1) {

// il blocco viene eseguito

} else if(c2) {

// il blocco non viene eseguito anche se 'c2' è 'true'

}


if(c3) {

// il blocco non viene eseguito perché 'c3' è 'false'

} else if(c2) {

// il blocco viene eseguito, poiché 'c2' è 'true' mentre 'c3' è 'false'
}




il test dice:
se (IF) c1=TRUE allora esegui il codice seguente
altrimenti (ELSE), (quindi C1 è FALSE) esegui quest'altro (test su c2)

siccome c1 è true, non eseguirà mai il test su c2.
in questo caso se il tuo programma deve eseguire il test anche su c2, non puoi nidificarli. devi scrivere:

if(c1) {
// il blocco viene eseguito
}
if(c2) {
// il blocco in questo caso lo esegue perché anche 'c2' è 'true'
// il ramo 'altrimenti', del primo test non esiste.
// il discorso fatto in precedenza
}

lo stesso discorso vale per il test su c3

VICIUS
24-11-2014, 11:09
Salve a tutti, :)

vorrei porvi delle domande che riguardano il linguaggio Java, e più precisamente if (else) e switch:

- Quale dei due è più veloce?
- In che condizioni è meglio usare uno invece dell'altro?

Nel 99.9999% dei casi sono identici come prestazioni. Se il numero di "case" supera un certo limite (sopra i 10. non ricordo di preciso), ed i valori sono tutti contigui come in una enum, allora viene usata una branch table. In questo caso lo switch diventa più veloce della serie di if/else.