Đoạn cuối cùng của Khoản 9 của Java hiệu quả, 2nd Edn, J. Bloch nói rằng, đối với các lớp học giá trị như Integer
, String
, Date
vv, trở về một hàm của các giá trị chính xác về điều đó lớp học là hashCode
không phải là ý tưởng hay.Tại sao giá trị của một lớp giá trị là hashCode của nó "không phải là một ý tưởng hay"?
Vì vậy, lớp Integer
trả lại value
của số nguyên nó đại diện như hashCode
sơ thẩm của nó không phải là tất cả tốt như vậy.
Không phải là hashCode()
của String
trả lại giá trị số nguyên được ánh xạ trực tiếp từ nội dung tổng thể, tức là các ký tự mà phiên bản String
có.
Những hashCode()
-tuân thủ rõ ràng hợp đồng.
Với tôi, nó có vẻ là một ý tưởng hay thay vì xấu - hashCode
-s thay đổi khi các giá trị khác nhau giữa các đối tượng và hashCodes
được "chuẩn hóa" trước khi chúng được trải ra thành các thùng của HashMap
/HashSet
- để các hashCode
-s của các mục không tạo thành một xu hướng mà bộ chứa các mục nhập sẽ đi vào
gì am i thiếu ở đây -. những gì làm cho việc lập bản đồ giá trị lớp trực tiếp đến hashCode
một "xấu ý kiến"?
TIA
// ===========================
EDIT
pls cũng thấy bình luận dưới câu trả lời của Steve Siebert về vấn đề này.
đồng ý với điều đó. nhưng giải pháp cho điều này nên bắt buộc một nguyên tắc là "không thể sử dụng hàm băm' hashCode' làm thay thế chỉ số/chức năng của 'giá trị'", thay vì hơn là nhận được mối quan hệ tốt đẹp giữa 'value' và' hashCode() 'và do đó giữa' equals() 'và' hashCode() '. – Roam
Tôi hoàn toàn đồng ý với bạn, một hashCode có thể được coi là một hàm trả về biểu diễn "ít thông minh/mất dữ liệu" về giá trị thực của đối tượng - dễ bị nghịch lý sinh nhật. Nhưng, thực sự, một băm không cần thiết * cần * để có một relationhsip với giá trị ... hashCode cần phải luôn luôn trả về cùng một giá trị int cho cùng một đối tượng (tuy nhiên điều này được định nghĩa bởi bạn) để đối tượng có thể được tìm thấy trong xô dự kiến. Thông thường, điều này được thực hiện bằng cách băm một/nhiều giá trị của đối tượng ... có ý nghĩa. Nhưng, nếu nó có thể được thực hiện với, nói ... ma thuật ... vậy thì tôi là ai để phán xét? =) –
bám 'hashCode' vào' value' có thể đảm bảo "nếu hai đối tượng không bằng nhau, không phải là hashCodes của chúng" và đó là điều tốt để có các mục phân phối đồng đều trên các nhóm băm-- mặc dù nó không một yêu cầu của hợp đồng. tôi không thấy và cũng không thể nghĩ ra cách tốt hơn để làm điều này. – Roam