Thông thường việc triển khai mặc định là Object.hashCode()
là một số chức năng của địa chỉ được phân bổ của đối tượng trong bộ nhớ (mặc dù điều này không được bắt buộc bởi JLS). Cho rằng VM shunts đối tượng về trong bộ nhớ, tại sao giá trị trả lại bởi System.identityHashCode()
không bao giờ thay đổi trong suốt thời gian của đối tượng?Làm thế nào để JVM đảm bảo rằng System.identityHashCode() sẽ không bao giờ thay đổi?
Nếu đó là phép tính "một lần" (đối tượng hashCode
được tính một lần và xếp vào tiêu đề đối tượng hoặc thứ gì đó), thì điều đó có nghĩa là có thể có hai đối tượng có cùng số identityHashCode
(nếu chúng xảy ra để được phân bổ đầu tiên tại cùng một địa chỉ trong bộ nhớ)?
Câu hỏi liên quan: Địa chỉ bộ nhớ đó có phải là địa chỉ bộ nhớ thực hoặc thứ gì đó ảo có thể giữ cố định ngay cả khi đối tượng bị xáo trộn không?Nếu ảo, điều đó sẽ tốt đẹp vì các con trỏ tới nó sẽ không cần phải được điều chỉnh. Mặt khác, điều này có nghĩa là một sự thêm vào và một bảng ánh xạ có khả năng lớn. – Thilo
Đó là một sự sắp xếp lại nhẹ của địa chỉ khi được yêu cầu lần đầu. (Trả về một mã băm với các bit thấp tất cả các số không là không lớn.) –
Thực ra, nó nói rằng identityHashCode không bao giờ phải thay đổi? JavaDoc cho System.identityHashCode không rõ ràng về điều đó. – Thilo