2014-05-11 20 views
21

Po prostu zacznij używać java.util.UUID. Moje pytanie brzmi, czy mam dwie zmienne UUID, na przykład u1 i u2, i chciałbym sprawdzić, czy są one równe, czy mogę bezpiecznie użyć wyrażenia u1 == u2 lub napisać u1.equals(u2)? zakładając, że oba nie są zerowe.Aby porównać UUID, czy mogę użyć == lub użyć UUID.equals (UUID)?

BTW, używam jej metody randomUUID do tworzenia nowych wartości UUID, ale myślę, że to nie powinno być ważne. Zastanawiam się, jak UUID jest wyjątkowy, każda wartość może być singleton, to jest bezpieczny w użyciu 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

Twój wpis jest mylący. Oczywiście, '==' wystarczy, jeśli naprawdę mówisz o ** zmiennych **. Jaki jest prawdziwy scenariusz? –

+0

dokumentacja java nie odpowiada na to pytanie. –

Odpowiedz

38

To zależy od jakiego rodzaju równości chcesz?

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 jest prawdziwe tylko wtedy, gdy a i b są tego samego obiektu. Jeśli są to dwa identyczne obiekty, nadal będzie to fałsz.

a.equals(b) jest prawdziwe, jeśli a i b mają tę samą wartość UUID - jeśli ich dwie części są takie same.

+0

Ach, masz rację. Powinienem był pomyśleć o napisaniu takiego kodu w celu weryfikacji. Dzięki. –

+0

Na początku myślałem, że ponieważ każda wartość UUID jest unikalna, dlaczego nie zaimplementować każdej wartości jako singleton. –

+0

@NewyachtZhang first, 'new' * always * tworzy nowy obiekt, więc musisz użyć czegoś innego, jak (hipotetycznie)' UUID.get'. Prawdopodobnie te "singletony" są tworzone na żądanie (w przeciwnym razie byłoby 340,282,366,98,938,463,463,374,607,431,768,211,456 obiektów), więc nie są one w rzeczywistości singletons. Ponadto tracenie czasu na śledzenie wszystkich istniejących obiektów UUID i przeszukiwanie ich za każdym razem, gdy używasz identyfikatora UUID. Ponadto jedyną korzyścią jest użycie '=='. Czy warto? (Gdyby tak było, zrobiliby to również za pomocą String) – immibis

2

No ... nie.

== przeciwko obiektowi sprawdza pod kątem równości referencyjnej. Oznacza to, że sprawdza, czy te dwa obiekty są dosłownie tym samym miejscem w pamięci.

sprawdzi rzeczywistą ekwiwalencję obiektu. I, Javadoc for UUID idzie bardzo szczegółowo, aby wyjaśnić, kiedy dwie instancje UUID są równoważne.

Powiązane problemy