2013-01-25 31 views
5

thể trùng lặp:
What’s the implementation of hashCode in java Object?Phương thức hashCode() trong lớp Object được triển khai như thế nào?

Trong khi tôi vừa xem qua một lớp đối tượng, tôi thấy rằng chỉ có một tuyên bố của phương thức hashCode(). Phần triển khai ở đâu? Nếu không có cách triển khai thực hiện phương thức hashCode() trả về cho tôi một kết quả như thế nào?

+1

Những người muốn downvote câu hỏi, hãy chia sẻ câu trả lời. Cảm ơn –

Trả lời

10

Nó được triển khai trong mã gốc. Để thực hiện, nó phức tạp hơn một chút - bạn có thể thay đổi việc triển khai mặc định. Nếu bạn nhìn vào các nguồn "Mở JDK", bạn sẽ thấy các tùy chọn sau:

-XX: hashCode = n (từ 0 đến 5).

  • 0 - Park-Miller RNG (mặc định)
  • 1 - chức năng của địa chỉ và một số quốc gia toàn cầu
  • 2 - const 1
  • 3 - sequenatial truy cập
  • 4 - địa chỉ của một đối tượng
  • 5 - chủ đề cụ thể xor-shift

Bạn có thể tìm thấy tập hợp chi tiết tại đây: http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp

Xem xét mã nguồn và nhận xét của hàm static inline intptr_t get_next_hash().

+0

tuyệt vời để biết ... không biết nếu bạn có thể tùy chỉnh này cũng có. – ManojGumber

+0

Điều này dường như đối với tôi câu trả lời thực sự !! – TechSpellBound

7

Từ khóa native cho biết rằng từ khóa đã được triển khai trong mã gốc (JVM).

+0

cảm ơn, nhưng làm thế nào và ai nhận được giá trị hashcode này và nó được trả về như thế nào? Một chút hiểu biết xin vui lòng !! –

+3

Điều đó sẽ liên quan đến việc xem xét mã của chính JVM và biết cách triển khai thực hiện các phương thức của JNI (Giao diện bản địa Java) theo các định nghĩa Java của chúng. Tôi tin rằng giá trị thực tế không nhất quán giữa các triển khai của JVM. Nếu bạn cần dựa vào giá trị thực tế, hãy ghi đè phương thức để phù hợp với nhu cầu của riêng bạn. – akaIDIOT

+0

+1. và tôi không nghĩ rằng có một thông số về giá trị thực tế của hashcode và cách tính toán của nó. (Nhưng tất nhiên, nó cần phải được nội bộ phù hợp trong cùng một cách như bất kỳ hashCode khác). – Thilo

5

Nếu bạn thấy declaration của hashcode

public native int hashCode(); 

native trong tuyên bố chỉ ra rằng nó được thực hiện natively trong mã JVM.

0

Phần triển khai ở đâu?

Nó đã được thực hiện bởi khuôn khổ rồi. Please see the documentation.

Nếu không có cách triển khai phương thức hashCode() trả về kết quả như thế nào?

Tuy nhiên, nếu bạn tạo loại tùy chỉnh, bạn có trách nhiệm tạo ra giá trị int đại diện cho trạng thái hiện tại của đối tượng. Here is a good example of that.

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