2014-05-11 16 views
21

Chỉ cần bắt đầu sử dụng java.util.UUID. Câu hỏi của tôi là nếu tôi có hai biến UUID, giả sử u1 và u2, và tôi muốn kiểm tra xem chúng có bình đẳng không, tôi có thể sử dụng biểu thức u1 == u2 một cách an toàn hay phải viết u1.equals(u2)? giả sử cả hai đều không phải là rỗng.Để so sánh UUID, tôi có thể sử dụng == hoặc phải sử dụng UUID.equals (UUID) không?

BTW, tôi đang sử dụng phương pháp randomUUID để tạo giá trị UUID mới, nhưng tôi nghĩ điều này không quan trọng. Tôi tự hỏi như UUID là duy nhất, mỗi giá trị có thể là một singleton, sau đó nó là an toàn để sử dụng 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

Bài đăng của bạn khó hiểu. Tất nhiên, '==' là đủ nếu bạn đang thực sự nói về ** biến **. Kịch bản thực sự là gì? –

+0

tài liệu java không trả lời câu hỏi này. –

Trả lời

38

Điều đó phụ thuộc: bạn muốn loại bình đẳng nào?

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 là đúng chỉ khi ab là cùng một đối tượng. Nếu chúng là hai đối tượng giống hệt nhau, nó vẫn sẽ là sai.

a.equals(b) là đúng nếu ab có cùng giá trị UUID - nếu hai phần của chúng giống nhau.

+0

Ah, bạn đã đúng. Tôi nên nghĩ về việc viết một đoạn mã như vậy để xác minh. Cảm ơn. –

+0

Lúc đầu, tôi nghĩ rằng mỗi giá trị UUID là duy nhất, tại sao không thực hiện từng giá trị như một singleton. –

+0

@NewyachtZhang trước tiên, 'mới' * luôn * tạo đối tượng mới, vì vậy bạn cần sử dụng một thứ khác như (giả thuyết)' UUID.get'. Ngoài ra, có lẽ những "singletons" được tạo theo yêu cầu (nếu không thì sẽ có 340,282,366,920,938,463,463,374,607,431,768,211,456 đối tượng) để chúng không thực sự là người độc thân. Ngoài ra, nó sẽ là một sự lãng phí thời gian để theo dõi tất cả các đối tượng UUID tồn tại và tìm kiếm thông qua chúng mỗi khi bạn sử dụng UUID. Ngoài ra, lợi ích duy nhất là để cho phép bạn sử dụng '=='. Nó có đáng không? (Nếu có, họ cũng sẽ làm điều đó với String) – immibis

2

Vâng ... không.

== đối với một đối tượng kiểm tra tính bình đẳng tham chiếu. Nghĩa là, nó kiểm tra xem liệu hai vật thể này có đúng là điểm giống nhau trong bộ nhớ hay không.

.equals() sẽ kiểm tra sự tương đương đối tượng thực tế. Và, các Javadoc for UUID đi vào chi tiết tuyệt vời để giải thích khi hai trường hợp UUID là tương đương.

Các vấn đề liên quan