2014-05-11 21 views
21

Basta iniziare a utilizzare java.util.UUID. La mia domanda è se ho due variabili UUID, diciamo u1 e u2, e vorrei verificare se sono uguali, posso usare tranquillamente l'espressione u1 == u2 o scrivere u1.equals(u2)? supponendo che entrambi non siano nulli.Per confrontare UUID, posso usare == o usare UUID.equals (UUID)?

BTW, sto usando il suo metodo randomUUID per creare nuovi valori UUID, ma penso che questo non dovrebbe essere importante. Mi chiedo come l'UUID sia unico, ogni valore potrebbe essere un singleton, quindi è sicuro usare u1 == u2.

void method1(UUID u1, UUID u2) { 

    // I know it is always safe to use equal method 
    if (u1.equals(u2)){ 
    // do something 
    } 

    // is it safe to use == 
    if (u1 == u2) { 
    // do something 
    } 
} 
+2

RTFM: http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html#compareTo(java.util.UUID) – alfasin

+0

Il post è confuso. Ovviamente, '==' è sufficiente se stai parlando di ** variabili **. Qual è lo scenario reale? –

+0

il documento java non risponde a questa domanda. –

risposta

38

Dipende: quale tipo di uguaglianza vuoi?

UUID a = new UUID(12345678, 87654321); 
UUID b = new UUID(12345678, 87654321); 
UUID c = new UUID(11111111, 22222222); 

System.out.println(a == a); // returns true 
System.out.println(a.equals(a)); // returns true 

System.out.println(a == b); // returns false 
System.out.println(a.equals(b)); // returns true 

System.out.println(a == c); // returns false 
System.out.println(a.equals(c)); // returns false 

a == b è vero solo se a e b sono lo stesso oggetto. Se sono due oggetti identici, sarà comunque falso.

a.equals(b) è vero se a e b sono lo stesso valore UUID - se le loro due parti sono le stesse.

+0

Ah, hai ragione. Avrei dovuto pensare di scrivere un pezzo di codice per verificarlo. Grazie. –

+0

All'inizio, ho pensato che ogni valore UUID è univoco, perché non implementare ogni valore come singleton. –

+0

@NewyachtZhang prima, 'new' * sempre * crea un nuovo oggetto, quindi è necessario utilizzare qualcos'altro come (ipoteticamente)' UUID.get'. Inoltre, presumibilmente questi "singleton" sono creati su richiesta (altrimenti ci sarebbero 340.282.366,920,938,463,463,374,607,431,768,211,456 oggetti) quindi non sono in realtà singleton. Inoltre, sarebbe inutile rintracciare tutti gli oggetti UUID esistenti e cercare attraverso di essi ogni volta che si utilizza un UUID. Inoltre, l'unico vantaggio è quello di usare '=='. Ne vale la pena? (Se lo fosse, lo farebbero anche con String) – immibis

2

Bene ... no.

== contro un oggetto controlla l'uguaglianza di riferimento. Cioè, controlla se questi due oggetti sono letteralmente lo stesso punto in memoria.

.equals() verificherà l'effettiva equivalenza dell'oggetto. Inoltre, lo Javadoc for UUID spiega in dettaglio quando due istanze di UUID sono equivalenti.