2014-05-11 4 views
21

Beginnen Sie einfach mit java.util.UUID. Meine Frage ist, wenn ich zwei UUID-Variablen habe, sagen u1 und u2, und ich möchte überprüfen, ob sie gleich sind, kann ich Ausdruck u1 == u2 sicher verwenden oder u1.equals(u2) schreiben müssen? Angenommen, beide sind nicht null.Um UUID zu vergleichen, kann ich == verwenden oder UUID.equals (UUID) verwenden?

Übrigens verwende ich seine randomUUID Methode, um neue UUID-Werte zu erstellen, aber ich denke, das sollte keine Rolle spielen. Ich frage mich, wie UUID einzigartig ist, jeder Wert könnte ein Singleton sein, dann ist es sicher zu verwenden 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

Ihr Beitrag ist verwirrend. Natürlich ist '==' genug, wenn Sie wirklich von ** Variablen ** sprechen. Was ist das wahre Szenario? –

+0

Das Java-Dokument beantwortet diese Frage nicht. –

Antwort

38

Es hängt davon ab: welche Art von Gleichheit wollen Sie?

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 ist nur wahr, wenn a und b das gleiche Objekt sind. Wenn es sich um zwei identische Objekte handelt, ist es immer noch falsch.

a.equals(b) ist wahr, wenn a und b den gleichen UUID-Wert haben - wenn ihre beiden Teile identisch sind.

+0

Ah, Sie haben Recht. Ich hätte darüber nachdenken müssen, ein solches Stück Code selbst zu schreiben, um es zu verifizieren. Vielen Dank. –

+0

Am Anfang dachte ich, da jeder UUID-Wert eindeutig ist, warum nicht jeden Wert als Singleton implementieren. –

+0

@NewyachtZhang zuerst, 'new' * always * erstellt ein neues Objekt, also müssten Sie etwas anderes wie (hypothetisch)' UUID.get' verwenden. Vermutlich werden diese "Singletons" auch auf Anfrage erstellt (sonst wären es 340.282.366.920.938.463.463.374.607.431.768.211.456 Objekte), also sind sie eigentlich keine Singletons. Außerdem wäre es Zeitverschwendung, alle vorhandenen UUID-Objekte zu verfolgen und sie jedes Mal zu durchsuchen, wenn Sie eine UUID verwenden. Der einzige Vorteil ist, dass Sie '==' verwenden können. Ist es das wert? (Wenn ja, würden sie es auch mit String machen) – immibis

2

Nun ... nein.

== gegen ein Objekt prüft auf Referenzgleichheit. Das heißt, es wird geprüft, ob diese beiden Objekte buchstäblich die gleiche Stelle im Speicher sind.

.equals() wird auf tatsächliche Objektäquivalenz prüfen. Und die Javadoc for UUID geht sehr ins Detail, um zu erklären, wenn zwei UUID Instanzen äquivalent sind.