2014-05-11 72 views
21

剛開始使用java.util.UUID。我的問題是,如果我有兩個UUID變量,比如說u1和u2,並且我想檢查它們是否相等,我可以安全使用表達式u1 == u2還是必須編寫u1.equals(u2)?假設兩者都不爲空。要比較UUID,我可以使用==還是必須使用UUID.equals(UUID)?

順便說一句,我正在使用它的randomUUID方法來創建新的UUID值,但我認爲這不應該是問題。 我想知道UUID是唯一的,每個值都可以是單例,那麼使用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

您的帖子很混亂。當然,如果你真的在談論**變量**,那麼'=='就足夠了。什麼是真實的場景? –

+0

java doc不回答這個問題。 –

回答

38

這取決於:你想要哪種類型的平等?

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是真的只有ab是同一個對象。如果它們是兩個相同的對象,它仍然是錯誤的。

a.equals(b)如果ab是相同的UUID值 - 如果它們的兩個部分相同,則爲true。

+0

啊,你是對的。我應該考慮自己編寫這樣一段代碼來驗證。謝謝。 –

+0

開始時,我認爲每個UUID值都是唯一的,爲什麼不把每個值作爲一個單獨值來實現。 –

+0

@NewyachtZhang首先,'new' * always *會創建一個新對象,所以您需要使用其他類似(假設)'UUID.get'。此外,大概這些「單身人士」是按需創建的(否則將會有340,282,366,920,938,463,463,374,607,431,768,211,456個對象),所以他們實際上並不是單身人士。而且,每次使用UUID時,追蹤存在的所有UUID對象並搜索它們將是浪費時間。另外,唯一的好處是讓你使用'=='。這值得麼? (如果是的話,他們也會用String來做) – immibis

2

那麼......沒有。

==針對對象檢查引用是否相等。也就是說,它會檢查這兩個對象是否在字面上是同一個內存點。

.equals()將檢查實際的對象等價性。並且,Javadoc for UUID詳細解釋了兩個實例的等效時間。

相關問題