2013-06-14 27 views
10

khi nào là thời điểm hợp lý để thực hiện dòng # 4 thay vì dòng # 3? Hoặc là họ hoàn toàn dư thừa gọi?sử dụng System.identityHashCode (obj) - khi nào? tại sao?

1 Object o1 = new Object(); 

2 

3 int hcObj = o1.hashCode(); 

4 int hcSys = System.identityHashCode(o1); 
+0

Uhm, câu hỏi hay ... Bằng cách này, cả hai phương thức trả về một int, không dài – fge

Trả lời

11

Đôi khi bạn có thể muốn tạo một tập hợp các đối tượng có thể phân biệt. Một số đối tượng đó có thể là bằng với nhau, nhưng bạn vẫn muốn tham chiếu đến tất cả các đối tượng ... chỉ ném đi các tham chiếu trùng lặp thực sự. Bạn có thể làm điều đó vì triển khai equals không phải là thứ bạn quan tâm (một số lớp ghi đè lên equals khi bạn thực sự không muốn chúng) hoặc vì bạn thực sự chỉ đang cố gắng đếm các trường hợp riêng lẻ, v.v.

Để làm điều đó hiệu quả (tức là được hỗ trợ bởi một bảng băm của một số loại) bạn muốn có một mã băm dựa trên danh tính chứ không phải là bình đẳng - đó là chính xác những gì identityHashCode cung cấp cho bạn. Đó là hiếm khi hữu ích, nhưng đôi khi nó vẫn có thể hữu ích.

+0

Tóm lại, 'Equivalence.identity()' của Guava có tác dụng gì? Nhưng ngay cả khi đó, bạn có 'IdentityHash {Map, Set}' – fge

+3

@fge: 'System.identityHashCode' là cách tất cả các cấu trúc dữ liệu đó được thực hiện. –

+0

"(một số đối tượng thực hiện bằng khi bạn thực sự không muốn họ)" Yêu phần này của câu trả lời của bạn. cảm ơn. –

3

Đối với đồng bằng Object, vâng, không cần thiết. Nhưng có những trường hợp một lớp có thể muốn sử dụng triển khai thực hiện mặc định hashCode (dựa trên bình đẳng tham chiếu) trên một thể hiện của một loại có thể đã ghi đè hashCode.

Grepcode lists these call sites, cụ thể là bao gồm IdentityHashMap trong số những người khác.

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